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

KeyValuePair列表和相同types的字典之间有什么区别? 有没有适当的时间使用其中一种?

当你不需要快速查找关键字时 – 维护Dictionary使用的hashtable有一定的开销。

简而言之,这个列表并不强制关键字的唯一性,所以如果你需要这个语义,那么这就是你应该使用的。

当你关心物品的顺序时,这个清单也是有用的。

字典是包含键值对的集合的genericstypes 。 字典对于查找操作是快速的,因为在内部使用散列函数 。 这意味着, 所有的键在字典中必须是唯一的

考虑这个例子:

 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. 

所以你至less应该考虑两件事:

  1. 你想在字典中search具体的项目吗?
  2. 你想有一些不唯一的字段(例如pair:firstname / lastname)。

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

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

答:XmlSerializer无法处理实现IDictionary接口的类。 这部分是由于日程安排的限制,部分是由于哈希表在XSDtypes系统中没有对应的事实。 唯一的解决scheme是实现一个不实现IDictionary接口的自定义哈希表。

从这里

在Silverlight的SOAP webservices中,我们发现Dictionary不会序列化。 这将是一个情况,你会在字典上使用KeyValuePair列表。

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

KeyValuePairDictionaryEntry
[Krzysztof Cwalina]

我们讨论了在Dictionary<K,V>上实现IEnumerable一个问题。 什么types应该IEnumerable.GetEnumerator().Current返回? KeyValuePair<K,V>DictionaryEntry ? 同ICollection.CopyTo 。 什么types的实例应该被复制到数组中?

我们决定如下: IEnumerableICollection接口实现将使用KeyValuePair<K,V>作为项目types。 IDictionary特定成员( GetEnumerator返回IDictionaryEnumerator )将使用DictionaryEntry作为项目types。

原因是我们正在IEnumerator<T>扩展IEnumerator地方进行更改。 如果从Dictionary<K,V> – > IEnumerable<T> – > IEnumerable行走层次结构,我们突然改变了从枚举数返回的项目的types,这将是非常奇怪的。