我有一个字典结构,里面有多个键值对。
myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);
我的词典用作某些控件的数据源。在控件的下拉列表中,我看到项目是这样的:
key1
key2
key3
订单看起来与我的字典相同。 我知道Dictionary不像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);
还有比这更好的方法吗?
谢谢!
答案 0 :(得分:20)
Dictionary<K,V>
不有订购。任何感知到的订单维护都是偶然的(以及特定实现的工件,包括但不限于存储桶选择顺序和计数)。
这些是我所知道的方法(仅使用Base Class Libraries BCL):
Lookup<K,V>
OrderedDictionary
O(n)
)List<KeyValuePair<K,V>>
快乐的编码。
创建维护插入顺序的哈希数据结构实际上只是对标准哈希实现的略微修改(Ruby哈希现在维护插入顺序);但是,这不是在.NET中完成的,更重要的是,它是Dictionary / IDictionary合同的一部分。
答案 1 :(得分:5)
你不能用Dictionary
类做到这一点。它正在您的示例中工作,因为数据结构的实现方式有些怪癖。数据结构实际上以时间顺序将条目存储在一个数组中,然后使用另一个数组来索引条目数组。枚举基于条目数组。这就是为什么它似乎是在您的情况下订购。但是,如果您应用一系列删除和插入操作,您会注意到这种排序受到干扰。
请改用KeyCollection。它通过键和索引提供O(1)检索,并保留时间顺序。
答案 2 :(得分:2)
从Dictionary(TKey,TValue)上的MSDN页面:
出于枚举的目的,字典中的每个项目被视为表示值及其键的KeyValuePair&lt;(&lt;(TKey,TValue&gt;)&gt;)结构。返回项目的顺序未定义。
我假设您不能使用SortedDictionary,因为控件依赖于您的数据源是Dictionary。如果控件需要Dictionary类型和排序数据,则需要修改控件,因为这两个标准相互矛盾。如果需要排序/排序功能,必须使用不同的数据类型。取决于未定义的行为是在寻找麻烦。
答案 3 :(得分:1)
不要使用字典 - 无法保证在添加其他元素时键的顺序不会改变。相反,为您的键值对定义一个类Pair
(在此处查看What is C# analog of C++ std::pair?作为示例)并使用List<Pair>
作为您的数据源。 List
有一个Insert
操作,可用于在列表中的任何位置插入新元素。
答案 4 :(得分:1)
Dictionary不应该用于对对象进行排序,而应该用它来查找对象。如果你想对它进行排序,我会建议别的东西。
如果展开词典,则没有任何规则可以阻止它混合你的列表。