什么时候使用List <KeyValuePair <T1,T2 >>代替Dictionary <T1,T2>?


95

相同类型的KeyValuePair列表和字典之间有什么区别?是否有适当的时间使用其中之一?

Answers:



62

简而言之,列表不会强制键的唯一性,因此,如果您需要该语义,则应使用该语义。


7
+1请注意,字典也不强制值的唯一性!
gdoron支持Monica

25

字典是通用类型,包含键/值对的集合。字典对于查找操作而言是快速的,因为在内部使用了哈希函数。这意味着,所有键在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.

因此,您应该始终考虑至少两件事:

  1. 您要搜索词典中的具体项目吗?
  2. 您是否希望某些字段不唯一(例如,对:名字/姓氏)。

1
我认为这里的重点是字典键必须唯一,而List <KeyValuePair>键不能唯一。
布鲁诺·比耶里

5
@BrunoBieri List <KeyValuePair>键可能不是唯一的
Nikhil Vartak

2
我纠正了您2年前的旧评论,您注意到了。难怪SO是唯一受信任和最受欢迎的问答平台。
Nikhil Vartak


7

除了Phillip Ngan的答案(SOAP还是其他方式)之外,您不能XML序列化实现IDictionary的对象。

问:为什么我不能序列化哈希表?

答:XmlSerializer无法处理实现IDictionary接口的类。这部分是由于调度约束,部分是由于哈希表在XSD类型系统中没有对应项。唯一的解决方案是实现不实现IDictionary接口的自定义哈希表。

从这里



3

http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx

KeyValuePairDictionaryEntry
[Krzysztof Cwalina]

我们讨论了IEnumerableon的 实现问题Dictionary<K,V>。应该IEnumerable.GetEnumerator().Current 返回什么类型 ?KeyValuePair<K,V>还是 DictionaryEntry?相同 ICollection.CopyTo。哪种类型的实例应复制到阵列?

我们决定如下:IEnumerableICollection接口实现将使用 KeyValuePair<K,V>的项目类型。 IDictionary特定成员(GetEnumeratorreturn IDictionaryEnumerator)将 DictionaryEntry用作项目类型。

原因是我们正在做出IEnumerator<T>将扩展 到何处的更改 IEnumerator。如果从Dictionary<K,V>-> IEnumerable<T>-> 遍历层次结构,IEnumerable 我们突然更改了从枚举数返回的项的类型,那将是非常奇怪的 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.