什么时候使用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应该考虑两件事:
- 你想在字典中search具体的项目吗?
- 你想有一些不唯一的字段(例如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 :
KeyValuePair
与DictionaryEntry
[Krzysztof Cwalina]我们讨论了在
Dictionary<K,V>
上实现IEnumerable
一个问题。 什么types应该IEnumerable.GetEnumerator().Current
返回?KeyValuePair<K,V>
或DictionaryEntry
? 同ICollection.CopyTo
。 什么types的实例应该被复制到数组中?我们决定如下:
IEnumerable
和ICollection
接口实现将使用KeyValuePair<K,V>
作为项目types。IDictionary
特定成员(GetEnumerator
返回IDictionaryEnumerator
)将使用DictionaryEntry
作为项目types。原因是我们正在
IEnumerator<T>
扩展IEnumerator
地方进行更改。 如果从Dictionary<K,V>
– >IEnumerable<T>
– >IEnumerable
行走层次结构,我们突然改变了从枚举数返回的项目的types,这将是非常奇怪的。