在特定位置添加字典元素

时间:2011-10-27 15:27:51

标签: c# dictionary

请考虑以下代码:

var myDict = new Dictionary<string, int>();

myDict.Add("Key1", 1);
myDict.Add("Key2", 2);
myDict.Add("Key4", 4);
myDict.Add("Key5", 5);

foreach (KeyValuePair<string, int> pair in myDict)
{
    Console.Write(pair.Key + @" --> ");
    Console.WriteLine(pair.Value);
}

myDict.Add("Key3", 3);
foreach (KeyValuePair<string, int> pair in myDict)
{
    Console.Write(pair.Key + @" --> ");
    Console.WriteLine(pair.Value);
}

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

6 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

Dictionary<TKey,TVal>课程。没有排序键的概念。你想要一个SortedDictionary,它将按键对字典进行排序。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

项目按照您添加它们的顺序进行枚举,因为您正在运行的特定CLR版本使用Dictionary的内部实现(有关Dictionary如何发布的帖子,请参阅here实际上实现了解它为什么这样做)

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

答案 5 :(得分:1)

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