1

我使用的结构可以表示为:

IEnumerable<KeyValuePair<TKey, TValue>>

鉴于编写时间太长(不算代码分析可能会发出警告),我更喜欢使用一些更具表现力的类型。.NET Framework 中是否有这种类型,或者我应该创建自己的类型?

请注意,它与字典不同:

IDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>

因为字典确保每个键都是唯一的,这不是我的情况。我也不能使用查找:

Lookup<TKey, TValue> : IEnumerable<IGrouping<TKey, TValue>>

因为查找不是惰性的,即它需要刷新所有数据才能对其进行分组。

4

6 回答 6

6

如果键和值有两种特定类型,则可以通过执行以下操作使用类型别名:

using PairSequence = System.Collections.Generic.IEnumerable<
    System.Collections.Generic.KeyValuePair<string, int>>;
于 2013-03-06T21:15:58.487 回答
2

这和它会得到的一样好。结构 KeyValuePair 并没有以接口的方式实现太多。您当然可以使用接口继承来创建自己的接口,基本上可以让您重命名IEnumerable<KeyValuePair<TKey, TValue>> ,但是这样做会失去更多,因为实现的类型IEnumerable<KeyValuePair<TKey, TValue>>不会实现您的自定义接口。

于 2013-03-06T21:15:13.897 回答
1

(半开玩笑半认真)

IEnumerable<KeyValuePair<TKey, TValue>>  <= length: 40 chars
IEnumerable<Tuple<TKey,TValue>> <= length: 32 chars
IList<Tuple<TKey,TValue>> <= length: 26 chars

在某些情况下,您也可能会破坏一些using用法:

using IEI = IEnumerable<int>;   // for example
于 2013-03-06T21:17:45.883 回答
0

除了您已经排除的字典之外,我不知道框架中有任何代表这种结构的东西。

于 2013-03-06T21:13:56.730 回答
0

不在 .NET Framework 中,不。

于 2013-03-06T21:15:56.057 回答
0

实施的问题IEnumerable<KeyValuePair<TKey,TValue>>是您没有任何后备存储。

作为一般规则,您应该实现代表问题域中事物的类型,即使是数字和字符串之类的事物。例如,使用字符串来表示邮政编码并不能告诉您有关数据类型的太多信息,但是使用名为的自定义数据类型PostalCode可以告诉您更多信息。更好的是抽象数据类型PostalCode(可能具有特定于国家/地区的具体实现)。

您的自定义类型,尤其是集合,可以只公开您需要的功能,而无需提供非特定集合类所做的所有功能。此外,您可以实施与您的问题域相关的域限制。例如,UsZipCode从抽象类型继承的具体PostalCode可能会将值限制为 5 或 9 个十进制数字,而具体CanadianPostalCode可能要求值由 2 个 3 字符字母数字序列组成。

但我离题了。

我可能会像这样简单地创建自己的类:

public class MyListOfKeysAndValues : IList<KeyValuePair<MyKeyType,MyValueType>>
{
  private List<KeyValuePair<MyKeyType,MyValueType>> MyBackingStore ;
  ...
}

公开所需的最少方法/属性。

于 2013-03-06T21:30:35.703 回答