2009-11-20 48 views

回答

52

当你不需要在密钥上快速查找时 - 维护Dictionary使用的哈希表具有一定的开销。

+6

另外列表插入操作是更快的,在字典 – 2009-11-20 09:27:01

+0

是不是KeyValuePair是只读? – 2016-12-27 04:55:34

+1

其字段是只读的,但您可以随时替换列表中的整个元素。 – 2016-12-27 06:21:09

46

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

+4

+1请注意,词典不强制值的唯一性! – gdoron 2011-11-08 09:36:17

3

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

KeyValuePairDictionaryEntry
[克齐斯茨托夫·克瓦林纳]

我们与 实施IEnumerableDictionary<K,V>讨论的一个问题。 IEnumerable.GetEnumerator().Current 应返回什么类型? KeyValuePair<K,V>DictionaryEntry?相同的 ICollection.CopyTo。什么 类型应该被复制到数组的实例?

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

的原因是,我们是在做一个改变,其中 IEnumerator<T>将延长 IEnumerator的过程 。如果从 Dictionary<K,V>IEnumerable<T>IEnumerable 我们突然改变了从枚举数返回的 项的类型,这将是非常奇怪的 。

5

在用于silverlight的SOAP webservices中,我们发现Dictionary不会序列化。这将是一种情况,您可以在Dictionary上使用KeyValuePair列表。

11

当你关心的项目的顺序列表也将是有益的。

+2

不会[SortedDictionary](https://msdn.microsoft.com/en-us/library/f7fta44c.aspx)覆盖此? – 2015-02-18 00:11:15

+2

是的,但SortedDictionary无法覆盖值的顺序,只有键。 – ConfusedMan 2015-04-15 21:04:44

7

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

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

答:XmlSerializer无法处理实现IDictionary接口的类。这部分是由于进度的限制,部分是由于这样的事实,一个哈希表没有在XSD类型系统的配对。唯一的解决方案是实现一个不实现IDictionary接口的自定义哈希表。

from here

12

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

考虑这方面的例子:

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)。
+0

我认为这里的要点是字典键必须是唯一的,其中List 键不能是唯一的。 – 2015-12-21 07:35:42

+0

@BrunoBieri List 键*可能*不是唯一的 – niksofteng 2017-06-06 14:44:51

+0

@niksofteng你是绝对正确的。我的错。 – 2017-06-06 19:57:54

相关问题