& # 39;字典类型# 39;在.net

本文关键字:net 字典 类型 | 更新日期: 2023-09-27 18:04:51

我在c#中使用过一些泛型字典。比如:

var example = new Dictionary<int, string> { 
                                        { 0, "Test0" }, 
                                        { 1, "Test1" } };

我依稀记得有人告诉我,在泛型出现之前,您可以使用Hashtable()。基本上是一样的,但是没有特定的类型(所以值类型将被框起来,我认为)。

var example2 = new Hashtable {
                          {0, "Test0"},
                          {1, "Test1"} };

还有像这样的问题讨论为什么我们更喜欢字典而不是哈希表(为什么字典比哈希表更受欢迎?)。

但是所有其他的"字典"类型呢?

  • SortedDictionary<K,V> -似乎像字典一样工作,但它的。keys集合是排序的。我不知道你为什么会在意。
  • OrderedDictionary是非通用的,就像哈希表一样,但我不能把我的头绕在与哈希表不同的地方。http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx提到它的键不像SortedDictionary那样排序,所以我只是不明白为什么或何时使用这个。
  • ListDictionary -当元素数量小于10时,比哈希表更小/更快(但它比通用字典更快吗?)再一次,我不知道你什么时候会使用这个。

我也对SortedList<K,V>感到困惑。当我听到List时,我不认为键/值对(也许我应该?)。它实现IDictionary<TKey,TValue>。从这个问题中,我可以看出它与SortedDictionary在性能特征上的不同(SortedList和SortedDictionary有什么区别?)

有人能简单解释一下什么时候使用哪种字典类型吗?

为简单起见,假设我可以访问。net 4.5或更高版本…也许哈希表不再有用了?

& # 39;字典类型# 39;在.net

DictionaryHashtable都表示对数据使用某种索引。查询索引需要一些时间,在元素数量较少的情况下会变慢。

List不使用索引,通常在末尾添加项。当插入元素时,其他元素"物理地"移动以为新元素创造空间,当删除元素时,其他元素移动以缩小间隙。

Dictionary通常不保持顺序,并且可能在内存中包含间隙。在添加项目时,这些空白可能由新项目填补。然后,对Dictionary进行迭代将以不同的顺序返回项。

排序是另一种排序——它不保留添加项的顺序,而是遵循规则来确定添加项的位置。

有趣的是,当泛化发生时,ArrayList变成了List<T>, Hashtable变成了Dictionary<T, U>——两者都从名称中删除了技术方面的内容,只留下了抽象的名称。

使用Dictionary<TKey,TValue>。没有理由使用旧的非泛型哈希表。


命令字典

如果字典中条目的插入顺序很重要,则使用OrderedDictionary

假设我有一个孩子到他们最喜欢的冰淇淋的映射。

OrderedDictioanry childToIcecream = new OrderedDictionary();
childToIcecream["Jake"] = "Vanilla";
childToIcecream["Kevin"] = "Chocolate";
childToIcecream["Megan"] = "Strawberry";

每天一个孩子轮流得到一个额外的勺子。我们可以将天数(Sunday = 0, Monday = 1..)除以孩子的数量,并从字典中提取他们的索引来选择这一天是谁的幸运日。当然,这只有在字典保持顺序的情况下才有效。否则,我将需要一个单独的List<string>来维持秩序。您可以在一个容器中获得键/值对和订单。

很遗憾没有通用的有序字典,但有人在这里发布了一个实现,


分类词典》

排序字典也是如此。如果您需要对键/值对进行排序,这将节省您保持它始终排序的时间,而不是在需要时进行昂贵的排序操作。

SortedDictionary<char, string> letterToWord = new SortedDictionary<char, string>();
letterToWord['b'] = "bat";    
letterToWord['c'] = "cat";    
letterToWord['a'] = "apple";

假设你有一个类似上面的字典,除了用户可以在运行时构建字母关联。您总是希望按字母顺序显示它,因此在添加每个新项时始终保持其排序是有意义的。


TLDR;

请始终使用Dictionary<TKey, TValue>,除非您有需要对其排序的情况。