你什么时候使用List <KeyValuePair <T1,T2 >>而不是Dictionary <T1,T2>?

Cor*_*ker 83 c# dictionary

对于相同类型,KeyValuePair列表和Dictionary之间有什么区别?是否有适当的时间使用其中一个?

Pav*_*aev 72

当您不需要快速查找密钥时 - 维护所使用的哈希表Dictionary具有一定的开销.

  • 另外列表插入操作比Dictionary中的更快 (7认同)
  • 它的字段是只读的,但您始终可以替换列表中的整个元素. (2认同)

RCI*_*CIX 59

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

  • +1注意字典也不强制值的唯一性! (7认同)

Mir*_*lec 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.
Run Code Online (Sandbox Code Playgroud)

所以你应该总是考虑至少两件事:

  1. 你想在字典中搜索具体项目吗?
  2. 您是否希望某些字段非唯一(例如pair:firstname/lastname).

  • @BrunoBieri List &lt;KeyValuePair&gt;键*可能*不是唯一的 (3认同)
  • 我认为这里的重点是字典键必须是唯一的,而 List&lt;KeyValuePair&gt; 键不能是唯一的。 (2认同)
  • 我纠正了您2年前的旧评论,您注意到了这一点。难怪SO是为什么是唯一受信任和最受欢迎的问答平台。 (2认同)

And*_*ico 14

当您关心物品的顺序时,列表也很有用.

  • 不会[SortedDictionary](https://msdn.microsoft.com/en-us/library/f7fta44c.aspx)覆盖这个吗? (2认同)
  • 是的,但SortedDictionary不能覆盖值的顺序,只能覆盖键. (2认同)

tjm*_*ore 7

继Phillip Ngan的回答,SOAP或其他方式,您不能XML序列化实现IDictionary的对象.

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

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

从这里


Phi*_*gan 5

在Silverlight的SOAP webservices中,我们发现Dictionary没有序列化.在这种情况下,您可以在Dictionary上使用KeyValuePair列表.

.