KeyValuePair的List和相同类型的Dictionary有什么区别?是否有适当的时间使用其中一种?
答案 0 :(得分:65)
当您不需要快速查找密钥时 - 维护Dictionary
使用的哈希表有一定的开销。
答案 1 :(得分:56)
简而言之,该列表不会强制键的唯一性,因此如果您需要该语义,则应该使用该语义。
答案 2 :(得分:21)
Dictionary 泛型类型,包含一组键值对。字典对于查找操作来说很快,因为在内部使用哈希函数。这意味着,所有密钥在字典中必须是唯一的。
请考虑以下示例:
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
所以你应该总是考虑至少两件事:
答案 3 :(得分:14)
当你关心物品的顺序时,列表也会很有用。
答案 4 :(得分:7)
除了Phillip Ngan的回答,SOAP或其他内容,您不能XML序列化实现IDictionary的对象。
问:为什么我不能序列化哈希表?
答:XmlSerializer无法处理实现IDictionary接口的类。这部分是由于计划约束,部分原因是哈希表在XSD类型系统中没有对应物。唯一的解决方案是实现一个不实现IDictionary接口的自定义哈希表。
答案 5 :(得分:5)
在Silverlight的SOAP webservices中,我们发现Dictionary没有序列化。在这种情况下,您将使用List of KeyValuePair而不是字典。
答案 6 :(得分:3)
来自http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:
KeyValuePair
与DictionaryEntry
对 [Krzysztof Cwalina]我们讨论了一个问题
IEnumerable
的实施Dictionary<K,V>
。应该是什么类型IEnumerable.GetEnumerator().Current
返回?KeyValuePair<K,V>
或DictionaryEntry
?同样的ICollection.CopyTo
。实例是什么 类型应该复制到数组?我们决定了以下内容:
IEnumerable
和ICollection
接口 实现将使用KeyValuePair<K,V>
作为项目类型。IDictionary
具体成员 (GetEnumerator
返回IDictionaryEnumerator
)将使用DictionaryEntry
作为项目类型。原因是我们正处于一个过程中 做出改变的地方
IEnumerator<T>
会延长IEnumerator
。这会很奇怪 如果走过层次结构Dictionary<K,V>
- &GT;IEnumerable<T>
- &GT;IEnumerable
我们突然改变了类型 枚举器返回的项目。