2011-10-27 28 views
3

考虑下面的代码添加一个词典元素:在一个特定的地方

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

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

回答

11

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

+0

不错,赶上乔恩。在这里,我认为我知道BCL中的所有集合班。每天学些新东西。 –

+1

+1教我新东西! :) – Polynomial

+0

+1 - 这正是我一直在寻找的。我也完全忘了这个存在 – Icemanind

1

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

的项目的顺序列举你加他们只是因为你碰巧特定的CLR版本使用的内部实现Dictionary来运行(见here关于字典实际上是如何实现的一个帖子理解为什么它这个)

改为使用SortedDictionarySortedList,或者如果要插入到特定索引中,请将您自己的集合组合成Dictionary(用于O(1)键查找)和List(以维护键顺序和插入一个特定的索引)。 OrderedDictionary可能会做你正在寻找的东西,但它是一个非泛型集合。

3

Dictionary<,>中没有“之间”的概念。这是一个无序的映射。迭代它会给不可预知的结果,这可能会在框架版本之间改变。如果您想保留某种排序,您可以有一个单独的List<T>LinkedList<T>代表名义键序。你必须保持彼此的最新状态。

2

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

2

对于标准的Dictionary<TKey, TValue>类型,这是不可能的。它本质上是一个无序的集合。任何保证订购的尝试都是行不通的。

使用SortedDictionaryTKey, TValue>如果您使比较器知道Dictionary中的元素位置,则此功能可以正常工作。然而,这几乎肯定是错误的做法。它真的听起来像你想在这里List<T> ..

1

词典是为了让他们的价值观通过他们的键..不通过指数。所以你应该考虑使用数组或List来代替。

相关问题