在特定位置添加字典元素

请考虑以下代码:

var myDict = new Dictionary(); myDict.Add("Key1", 1); myDict.Add("Key2", 2); myDict.Add("Key4", 4); myDict.Add("Key5", 5); foreach (KeyValuePair pair in myDict) { Console.Write(pair.Key + @" --> "); Console.WriteLine(pair.Value); } myDict.Add("Key3", 3); foreach (KeyValuePair pair in myDict) { Console.Write(pair.Key + @" --> "); Console.WriteLine(pair.Value); } 

我想要做的是在"Key2""Key4"之间插入"Key3" "Key4" 。 为简单起见,我以此为例。 我知道我可以使用SortedDictionary,我可以让这个例子起作用。 我需要能够具体做的是,每当我在字典中插入一个新元素时,我总是希望它在第二个元素之后和第三个元素之前插入它。 我怎么能做到这一点?

您可以使用OrderedDictionaryOrderedDictionary.Insert允许您指定将插入密钥的索引。

Dictionary<,>没有“between”的概念。 这是一个无序的映射。 迭代它会产生不可预测的结果,这可能会在框架版本之间发生变化。 如果要保留某种排序,可以使用单独的ListLinkedList表示名义键顺序。 你必须让它们保持最新状态。

Dictionary类。 没有排序键的概念。 你想要一个SortedDictionary ,它将按键对你的字典进行排序。

使用标准Dictionary类型无法做到这一点。 它本质上是一个无序的集合。 任何保证订购的尝试都行不通。

使用SortedDictionaryTKey, TValue>如果您让比较器知道Dictionary中的元素位置,这可能会有效。 然而,这几乎肯定是错误的方法。 听起来你真的想要一个List

这不是字典的用途。 根据定义,字典是未排序的。 没有第2或第4个元素,因为它们只能通过键访问。

这些项目按照您添加它们的顺序进行枚举,因为您正在运行的特定CLR版本使用的Dictionary的内部实现(请参阅此处获取有关如何实际实现Dictionary以了解其执行操作的post)

改为使用SortedDictionarySortedList ,或者,如果要插入特定索引,请将自己的集合(包括用于O(1)键查找)和List(用于维护键顺序并插入特定索引)进行滚动。 OrderedDictionary可能会做你想要的,但它是一个非generics的集合。

字典意味着通过键访问它们的值..而不是通过索引。 所以你应该考虑使用数组或List。