首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net中的“字典类型”

.Net中的“字典类型”
EN

Stack Overflow用户
提问于 2014-05-24 16:59:45
回答 2查看 402关注 0票数 4

我在C#中使用过一些通用字典。比如:

代码语言:javascript
复制
var example = new Dictionary<int, string> { 
                                        { 0, "Test0" }, 
                                        { 1, "Test1" } };

我隐约记得有人告诉我,在泛型出现之前,您可以使用Hashtable()。基本上是一样的,但是没有一个特定的类型(因此,我认为值类型将被装箱)。

代码语言:javascript
复制
var example2 = new Hashtable {
                          {0, "Test0"},
                          {1, "Test1"} };

还有一些类似的问题,讨论为什么我们更喜欢字典而不是哈希表(Why is Dictionary preferred over hashtable?)。

,但是其他的‘字典’类型呢?

  • SortedDictionary<K,V> --看起来像字典一样工作,但它的.Keys集合是排序的。我不知道你为什么会在乎。
  • OrderedDictionary是非泛型的,就像哈希表一样,但我无法理解与哈希表不同的地方。http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx提到它的键没有像SortedDictionary那样排序,所以我不明白为什么或者什么时候使用它。
  • ListDictionary -比Hashtable更小/更快(但它比通用字典更快吗?)当元素的数量小于10个时,我对你何时使用这个感到迷惑不解。

我也对SortedList<K,V>感到困惑。当我听到List时,我不认为键/值对(也许我应该?)。它实现了IDictionary<TKey,TValue>。从这个问题中,我可以看出它与SortedDictionary在性能特性(What's the difference between SortedList and SortedDictionary?)上的不同

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

为了简单起见,假设我可以访问.Net 4.5或higher...so,也许没有任何情况下哈希表是有用的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-24 18:07:29

DictionaryHashtable都表示使用某种类型的数据索引。查阅索引需要一段时间,使其在少量元素时变慢。

List不使用索引,项目通常在末尾添加。当插入项时,其他项“物理”移动以为新元素创建空间,而在移除项时,其他项移动以缩小差距。

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-05-24 18:01:59

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

有序字典

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

比如说我给孩子们画了一张他们最喜欢的冰淇淋图。

代码语言:javascript
复制
OrderedDictioanry childToIcecream = new OrderedDictionary();
childToIcecream["Jake"] = "Vanilla";
childToIcecream["Kevin"] = "Chocolate";
childToIcecream["Megan"] = "Strawberry";

每天一个孩子轮流得到一个额外的铲子。我们可以取日号(星期日= 0,星期一=1.)它根据孩子的数量,从字典中抽取他们的索引来选择哪一天是幸运日。当然,这只有在字典保持顺序的情况下才能起作用。否则,我需要一个单独的List<string>来维持订单。您将获得键/值对并在一个容器中订购。

不幸的是,没有通用有序字典,但是有人发布了一个实现here

排序字典

分类字典也一样。如果您需要对键/值对进行排序,这将节省您将其始终排序的时间,而不必在需要时执行昂贵的排序操作。

代码语言:javascript
复制
SortedDictionary<char, string> letterToWord = new SortedDictionary<char, string>();
letterToWord['b'] = "bat";    
letterToWord['c'] = "cat";    
letterToWord['a'] = "apple";

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

除非遇到需要对其进行排序或排序的情况,否则始终使用Dictionary<TKey, TValue>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23847558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档