请考虑以下代码:
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,我可以让这个例子起作用。我需要能够具体做的是,每当我在字典中插入一个新元素时,我总是希望它在第二个元素之后和第三个元素之前插入它。我怎么能做到这一点?
答案 0 :(得分:11)
您可以使用OrderedDictionary
。 OrderedDictionary.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实际上实现了解它为什么这样做)
改为使用SortedDictionary
或SortedList
,或者,如果要插入特定索引,请将自己的集合(包括O(1)键查找)和List(到维护密钥顺序并插入特定索引)。 OrderedDictionary可能会做你想要的,但它是一个非泛型的集合。
答案 5 :(得分:1)
字典意味着通过键访问它们的值..而不是通过索引。所以你应该考虑使用数组或List。