2011-09-22 233 views
9

我有一个字典结构,里面有多个键值对。如何插入字典中的第一个元素?

myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

我的字典被用作一些控件的数据源。在控件的下拉我看的项目是这样的:

key1 
key2 
key3 

顺序看起来与我的字典。 我知道字典不像arrayList - 你可以得到索引左右。 我无法使用sortedDictionary。 现在我需要一个更重要的价值对我的程序的某些点添加到这个字典中,我希望它有同样的效果,我这样做:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

如果我这样做,我知道则newkey将显示在我的控制中作为第一要素。

我有一个想法创造一个tempDict,把每对myDict到tempDict,然后清除myDict,再加入对回这样的:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

难道还有比这更好的办法?

谢谢!

回答

19

Dictionary<K,V>确实不是有排序。任何感知的订单维护都是偶然的(并且特定实现的人为因素包括但不限于存储桶选择顺序和计数)。

这些都是方法(只使用Base Class Libraries BCL)我知道:

  1. Lookup<K,V>
    • .NET4的,一成不变的,可以(在建手表式两份),键映射到多个值
  2. OrderedDictionary
    • 旧的非通用预期字典性能曼斯界限(其他两种方法O(n) “获取(键)/套(键)”)
  3. List<KeyValuePair<K,V>>
    • .NET2/3还行,可变的,多跑腿,可以映射键多个值(在插入观看重复)

编码愉快。


创建哈希数据结构维持插入顺序实际上只一个标准的散列实现的轻微的修改(红宝石散列现在保持插入顺序);然而,这不是在.NET中完成的,更重要的是它是Dictionary/IDictionary合同的一部分。

+0

你是什么意思在查询“手表插入”?你是否认为在向查询插入值时需要小心?如果是这样,那就不是这样,因为查找是不可变的。 – phoog

+0

@phoog由于它*可以*处理单个键到多个值,因此可能会导致字典无法实现的情况。措辞不理想。 – 2011-09-22 23:08:38

+0

+1这个优秀的答案 –

1

不要使用字典 - 不能保证在添加更多元素时键的顺序不会改变。相反,请为您的键值对(定义What is C# analog of C++ std::pair?为例)定义类Pair,并为您的数据源使用List<Pair>List有一个Insert操作,您可以使用它将新元素插入到列表中的任何位置。

+0

但我的控制需要字典来提供数据源,我们不想改变控制。 – spspli

+1

@spspli:好医生在说什么是你不要忽视“字典'的基础知识。所以要么改变你的数据结构,要么你生活在一个无序的集合中。 – user7116

+3

如果您希望控件以特定的列表式顺序显示元素,并且唯一允许的数据源是字典(不提供特定顺序),那么您的控件是错误设计的,您不能指望为您找到解决方案问题。因此,无论是改变控制方式,使用不同的控制方式,还是要找到更多关于控制的信息,是否有其他方法可以将订购信息从外部输入。 –

2

从MSDN页上词典(TKEY的,TValue):

对于枚举的目的,字典中的每个项被视为一个KeyValuePair <(中<(TKEY的,TValue>中)>)结构代表价值和关键。项目返回的顺序是未定义的。

我假设你不能使用SortedDictionary,因为控件取决于你的数据源是一个字典。如果控件需要字典类型和排序数据,则需要修改控件,因为这两个标准相互矛盾。如果您需要排序/排序功能,您必须使用其他数据类型必须。取决于未定义的行为是在寻求麻烦。

5

你不能那样做Dictionary类。由于数据结构的实施方式有些怪异,它在你的例子中起作用。数据结构实际上按时间顺序将条目存储在一个数组中,然后使用另一个数组索引到条目数组中。枚举基于入口数组。这就是为什么它似乎是在你的情况下命令。但是,如果您应用一系列删除和插入操作,您会注意到此订购受到干扰。

改为使用KeyCollection。它通过密钥和索引提供O(1)检索,并保留时间顺序。

+0

+1希望我知道KeyCollection之前(但为什么它关闭在ComponentModel名称空间,为什么它依靠被扩展?: - /) – 2011-09-22 21:11:49

+0

@pst:我不知道...好问题。 –

+0

+1 [KeyedCollection](http://msdn.microsoft.com/en-us/library/ms132438.aspx)正是我一直在寻找的! – Ben

1

字典不应该用来排序对象,而应该用来查找对象。如果你想让它对对象进行排序,我会建议其他的东西。

如果你展开字典,没有规则可以阻止它混淆你的列表。

相关问题