2013-03-06 57 views
1

我使用它可以作为代表的结构:是否存在与IEnumerable <KeyValuePair <TKey,TValue >>相同的结构?

​​

鉴于它太长写(不包括该代码分析可能会发出警告),我更愿意使用一些更富有表现力的类型。 在.NET Framework中是否有这样的类型,还是应该创建自己的?

请注意,这是不一样的字典:

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

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

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

因为查找是不是懒惰的,即它需要的所有数据,以便刷新到组它。

+0

你需要添加,删除,查找等时间复杂度? – 2013-03-06 21:16:08

+1

'IEnumerable >'键入的时间更短... – 2013-03-06 21:16:40

+0

实现上是否需要其他约束? – 2013-03-06 21:16:43

回答

2

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

0

我没有意识到框架中的任何东西,它代表了这种结构,除了你已经排除的Dictionary以外。

0

不在.NET Framework中,没有。

6

如果你有两种特定类型的键,你可以通过做使用类型别名值:

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

+1 - A *使用别名指令*。我没有意识到这些:) http://msdn.microsoft.com/en-us/library/sf0df423.aspx – 2013-03-06 21:22:51

+0

+1 to'using' answers ... – 2013-03-06 21:25:56

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 
0

的问题只是执行IEnumerable<KeyValuePair<TKey,TValue>>是你没有任何后备存储。

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

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

但我离题了。

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

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

揭露最小的方法/需要的属性。

+0

创建一个自定义类型是微不足道的,只需要一个构造函数它接受一个'IEnumerable >',实现该接口,并让所有方法都重定向到您在构造函数中接受的实例。除了名称较短之外,该类型不会执行任何操作,并将所有调用重定向到封装对象。为了清理代码,这可以起到有用的作用。 OP询问他是否可以避免创建自己的自定义类型。 – Servy 2013-03-06 21:43:43

相关问题