你什么时候使用List <keyvaluepair <t1,t2 =“”>&gt;而不是字典<t1,t2 =“”>?</t1,> </keyvaluepair <t1,>

时间:2009-11-20 08:33:57

标签: c# dictionary

KeyValuePair的List和相同类型的Dictionary有什么区别?是否有适当的时间使用其中一种?

7 个答案:

答案 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.

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

  1. 您想在词典中搜索具体项目吗?
  2. 你想要一些领域吗? 非唯一的(例如pair:firstname / lastname)。

答案 3 :(得分:14)

当你关心物品的顺序时,列表也会很有用。

答案 4 :(得分:7)

除了Phillip Ngan的回答,SOAP或其他内容,您不能XML序列化实现IDictionary的对象。

  

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

     

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

from here

答案 5 :(得分:5)

在Silverlight的SOAP webservices中,我们发现Dictionary没有序列化。在这种情况下,您将使用List of KeyValuePair而不是字典。

答案 6 :(得分:3)

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

  

KeyValuePairDictionaryEntry对   [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   我们突然改变了类型   枚举器返回的项目。