我在C#中使用过一些通用字典。比如:
var example = new Dictionary<int, string> {
{ 0, "Test0" },
{ 1, "Test1" } };我隐约记得有人告诉我,在泛型出现之前,您可以使用Hashtable()。基本上是一样的,但是没有一个特定的类型(因此,我认为值类型将被装箱)。
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,也许没有任何情况下哈希表是有用的?
发布于 2014-05-24 18:07:29
Dictionary和Hashtable都表示使用某种类型的数据索引。查阅索引需要一段时间,使其在少量元素时变慢。
List不使用索引,项目通常在末尾添加。当插入项时,其他项“物理”移动以为新元素创建空间,而在移除项时,其他项移动以缩小差距。
Dictionary通常不保留顺序,并且可能包含内存中的空白。添加项目时,这些空白可能由新项来填补。然后,迭代Dictionary将以不同的顺序返回这些项。
排序是一种不同的排序方式--它不保留添加项的顺序,而是遵循规则来确定添加项的位置。
有趣的是,当泛化发生时,ArrayList变成了List<T>,而Hashtable变成了Dictionary<T, U> --两者都从名称中删除了技术方面的内容,只留下了抽象的名称。
发布于 2014-05-24 18:01:59
使用Dictionary<TKey,TValue>。没有理由使用旧的非泛型哈希表。
有序字典
如果字典中条目的插入顺序很重要,那么使用OrderedDictionary。
比如说我给孩子们画了一张他们最喜欢的冰淇淋图。
OrderedDictioanry childToIcecream = new OrderedDictionary();
childToIcecream["Jake"] = "Vanilla";
childToIcecream["Kevin"] = "Chocolate";
childToIcecream["Megan"] = "Strawberry";每天一个孩子轮流得到一个额外的铲子。我们可以取日号(星期日= 0,星期一=1.)它根据孩子的数量,从字典中抽取他们的索引来选择哪一天是幸运日。当然,这只有在字典保持顺序的情况下才能起作用。否则,我需要一个单独的List<string>来维持订单。您将获得键/值对并在一个容器中订购。
不幸的是,没有通用有序字典,但是有人发布了一个实现here,
排序字典
分类字典也一样。如果您需要对键/值对进行排序,这将节省您将其始终排序的时间,而不必在需要时执行昂贵的排序操作。
SortedDictionary<char, string> letterToWord = new SortedDictionary<char, string>();
letterToWord['b'] = "bat";
letterToWord['c'] = "cat";
letterToWord['a'] = "apple";假设您有一个类似上述的字典,除非用户可以在运行时构建字母关联。您总是希望按字母顺序显示它,因此在添加每个新项时始终保持排序是有意义的。
除非遇到需要对其进行排序或排序的情况,否则始终使用Dictionary<TKey, TValue> 。
https://stackoverflow.com/questions/23847558
复制相似问题