是否有与IEnumerable相同的结构<keyvaluepair <tkey,tvalue =“”>&gt;?</keyvaluepair <tkey,>

时间:2013-03-06 21:11:24

标签: c# .net data-structures ienumerable lazy-evaluation

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

IEnumerable<KeyValuePair<TKey, TValue>>

鉴于写入时间太长(不计算代码分析可能会发出警告),我宁愿使用更具表现力的类型。 .NET Framework中是否存在此类型,或者我应该创建自己的类型?

请注意,它与字典不同:

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

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

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

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

6 个答案:

答案 0 :(得分:6)

如果您有两个特定类型的键和值,您可以使用类型别名:

using PairSequence = System.Collections.Generic.IEnumerable<
    System.Collections.Generic.KeyValuePair<string, int>>;

答案 1 :(得分:2)

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

答案 2 :(得分: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

答案 3 :(得分:0)

我不知道框架中的任何内容,代表除了字典之外的这种结构,你已经排除了它。

答案 4 :(得分:0)

不在.NET Framework中,没有。

答案 5 :(得分:0)

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

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

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

但我离题了。

我可能只是创建我自己的类:

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

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