OrderedDictionary和Dictionary

Dea*_*sus 52 c# dictionary ordereddictionary

我正在寻找一种方法来按照添加它们的顺序Dictionary枚举它KeyValuePair.现在,Dictionary的文档明确指出:

出于枚举的目的,字典中的每个项目都被视为KeyValuePair<TKey, TValue>表示值及其键的结构.返回项的顺序未定义.

我发现我需要的是一个OrderedDictionary,但我是怀疑论者,我决定亲自尝试:

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " + de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}
Run Code Online (Sandbox Code Playgroud)

输出:

OrderedDictionary
key0, value0
key1, value1
key2, value2
...

Dictionary
key0, value0
key1, value1
key2, value2
...
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,两者都是有序的,并提出了两个问题:
在哪种情况下,Dictionary给出与添加值的顺序不同的顺序?我的第一个foreach循环是否确保我以KeyValuePair相同的顺序检索我,或者我是否必须使用索引?

Ily*_*nov 62

你做错了.您不仅需要按顺序将值插入到字典中,还需要删除一些元素,并在此之后查看订单的更改方式.下一代码演示了这个:

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();
Random r = new Random();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
    if (i % 3 == 0)
    {
        od.Remove("key" + r.Next(d.Count));
        d.Remove("key" + r.Next(d.Count));
    }
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " +de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}
Run Code Online (Sandbox Code Playgroud)

打印类似的东西(OrderedDictionary总是有序):

OrderedDictionary
key3, value3
key5, value5
key6, value6
key7, value7
key8, value8
key9, value9
Dictionary
key7, value7
key4, value4
key3, value3
key5, value5
key6, value6
key8, value8
key9, value9
Run Code Online (Sandbox Code Playgroud)

  • @DeadlyJesus另一个重要的一点是OrderedDictionary**保证**键被排序,而Dictionary没有.只要他们的"合同"/定义得到满足,没有什么可以防止C#的内部实现改变了!所以也许将来某个地方你可以换成Mono,或升级到C#6.5,或类似的东西; 突然间你会遇到意想不到的错误. (14认同)
  • @DeadlyJesus看,添加新项目后,Dictionary通过将容量增加两个来调整内部数据结构.这导致将元素再次插入到数组`Dictionary <TKey,TValue> .Entry []条目中;`使用新键.这可能会导致更改商品的顺序.我将尝试通过示例来展示它(仍然没有弄清楚如何显示这个),但是如果你依赖于命令我会使用`OrderedDictionary`,即使你只是在其中插入值. (4认同)
  • @ANeves我不确定我是否同意OrderedDictionary对它的键进行排序(如果这是您的意思)。OrderedDictionary绝不是排序字典;它只是在添加项目时保持其顺序。 (4认同)
  • @ANeves 现在读起来更好了。我很惊讶仍然没有 OrderedDictionary 的通用版本,因为它是在 .NET2.0 中引入的......也许没有足够的人声称它很有用...... (2认同)