如何在字典中插入第一个元素?

我有一个字典结构,里面有多个键值对。

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); 

还有比这更好的方法吗?

谢谢!

Dictionary没有排序。 任何感知到的订单维护都是偶然的(以及特定实现的工件,包括但不限于存储桶选择顺序和计数)。

这些是我知道的方法(只使用基类库BCL ):

  1. Lookup
    • .NET4,不可变,可以将键映射到多个值(在构建期间注意重复)
  2. OrderedDictionary
    • 旧的,非generics的,预期的字典性能边界(其他两种方法是“get(key)/ set(key)”的O(n)
  3. List>
    • .NET2 / 3没关系,可变,更多的legwork,可以将键映射到多个值(注意插入中的重复项)

快乐的编码。


创建维护插入顺序的哈希数据结构实际上只是对标准哈希实现的略微修改(Ruby哈希现在维护插入顺序); 但是,这不是在.NET中完成的,更重要的是,它是Dictionary / IDictionary合同的一部分。

你不能用Dictionary类做到这一点。 它正在您的示例中工作,因为数据结构的实现方式有些怪癖。 数据结构实际上以时间顺序将条目存储在一个数组中,然后使用另一个数组来索引条目数组。 枚举基于条目数组。 这就是为什么它似乎是在你的情况下订购。 但是,如果您应用一系列删除和插入操作,您会注意到这种排序受到干扰。

请改用KeyCollection 。 它通过键和索引提供O(1)检索并保留时间顺序。

从Dictionary上的MSDN页面(TKey,TValue):

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair <(Of <(TKey,TValue>)>)结构。 返回项的顺序未定义。

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

不要使用字典 – 无法保证在添加其他元素时键的顺序不会改变。 相反,为Key-Value-Pairs定义一个类Pair (在这里看一下C ++的C#模拟std :: pair? )并使用List作为数据源。 List有一个Insert操作,可用于在列表中的任何位置插入新元素。

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

如果展开“词典”,则没有规则可以阻止它混淆“列表”。