【问题标题】:Adding a dictionary element at a specific place在特定位置添加字典元素
【发布时间】:2011-10-27 15:27:51
【问题描述】:

考虑以下代码:

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 并且我可以让这个示例工作。不过,我需要特别做的是,每当我在字典中插入一个新元素时,我总是希望它在第二个元素之后和第三个元素之前插入它。我怎样才能做到这一点?

【问题讨论】:

    标签: c# dictionary


    【解决方案1】:

    您可以为此使用OrderedDictionaryOrderedDictionary.Insert 允许您指定插入键的索引。

    【讨论】:

    • 很好地抓住了乔恩。在这里,我以为我知道 BCL 中的所有集合类。每天学习新东西。
    • +1 -- 这正是我想要的。我也完全忘记了它的存在
    • 然而,它是非泛型的。您可能想要滚动您自己的收藏,同时使用字典和列表。
    • @thecoop:我更喜欢聚合 OrderedDictionary 并在其上公开一个类型化的接口。
    • @Jon:这确实意味着你在不必要地装箱;使用列表和字典可以防止这种情况。
    【解决方案2】:

    Dictionary&lt;,&gt; 中没有“介于”的概念。这是一个 无序 映射。对其进行迭代将产生不可预测的结果,这些结果可能会在框架版本之间发生变化。如果您想保留某种排序,您可以有一个单独的 List&lt;T&gt;LinkedList&lt;T&gt; 代表名义键顺序。您必须使它们彼此保持最新。

    【讨论】:

      【解决方案3】:

      Dictionary&lt;TKey,TVal&gt; 类。没有排序键的概念。你想要一个SortedDictionary,它会按键对你的字典进行排序。

      【讨论】:

        【解决方案4】:

        这对于标准的Dictionary&lt;TKey, TValue&gt; 类型是不可能的。它本质上是一个无序的集合。任何保证订购的尝试都不会奏效。

        使用SortedDictionaryTKey, TValue&gt;,如果您让比较器知道Dictionary 中的元素位置,这可能会起作用。然而,这几乎可以肯定是错误的方法。听起来你真的想要一个List&lt;T&gt; 这里..

        【讨论】:

          【解决方案5】:

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

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

          请改用SortedDictionarySortedList,或者,如果您想插入特定索引,请滚动您自己的集合,结合字典(用于 O(1) 键查找)和列表(以保持键顺序并在特定索引处插入)。 OrderedDictionary 可能会满足您的需求,但它是一个非泛型集合。

          【讨论】:

            【解决方案6】:

            字典的目的是通过它们的键访问它们的值..而不是通过索引。所以你应该考虑改用数组或列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-27
              • 2013-06-05
              • 1970-01-01
              • 1970-01-01
              • 2020-01-17
              • 1970-01-01
              相关资源
              最近更新 更多