& # 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或更高版本…也许哈希表不再有用了?
Dictionary
和Hashtable
都表示对数据使用某种索引。查询索引需要一些时间,在元素数量较少的情况下会变慢。
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>
,除非您有需要对其排序的情况。