为什么ConcurrentDictionary <decimal,...>。tryAdd修改字典中项目的顺序? C#

时间:2019-01-24 17:18:15

标签: c# concurrentdictionary

我在Dictionary中添加了四个元素,并使用ForEach循环遍历字典:项按添加顺序。

我在ConcurentDictionary中添加了四个元素,并使用ForEach循环遍历了ConcurentDictionnary:按添加顺序,是项。

为什么?

    static void Main(string[] args)
    {

        Console.WriteLine("Add four items to dictionnary");
        var d = new Dictionary<decimal, int>();

        d.Add(1.05m, 1);
        d.Add(2.3m, 2);
        d.Add(1.3m, 3);
        d.Add(4m, 4);

        Console.WriteLine("iterate trough Dictionnary");
        foreach (var x in d) Console.WriteLine($"{x.Key:0.000} {x.Value}");

        Console.WriteLine("\r\nAdd four items to ConcurrentDictionary");
        var cd = new ConcurrentDictionary<decimal,int>();

        cd.TryAdd(1.05m, 1);
        cd.TryAdd(2.3m, 2);
        cd.TryAdd(1.3m, 3);
        cd.TryAdd(4m, 4);

        Console.WriteLine("iterate trough  ConcurrentDictionary");
        foreach (var x in cd) Console.WriteLine($"{x.Key:0.000} {x.Value}");

        Console.WriteLine("\r\niterate trough  Keys");
        foreach (var x in cd.Keys) Console.WriteLine($"{x:0.000}");

        Console.WriteLine("\r\niterate trough  Keys");
        foreach (var x in cd.Values) Console.WriteLine($"{x}");

        Console.ReadKey();
    }

结果

在字典中添加四个项目 迭代低谷词典
1.050 1
2.300 2
1.300 3
4.000 4

向ConcurrentDictionary添加四个项目
迭代槽ConcurrentDictionary
4.000 4
2.300 2
1.300 3
1.050 1

迭代槽键
4.000
2.300
1.300
1.050

迭代谷值
4
2
3
1

编辑:该测试表明,即使文档中未保证该顺序,实际上也是如此。

我在ConcurrentDictionary.cs中阅读了源代码,发现为什么ConcurrentDictionary与Dictionary不同。

我尝试写一个响应(是法国人和初学者,写一个关于stackoverflow的问题)

1 个答案:

答案 0 :(得分:0)

Dictionaryhttps://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2)的MSDN文档指出

  

未归还物品的顺序

尽管ConcurrentDictionary的文档没有这么说(https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2),但也是如此。这个问题 Is the list order of a ConcurrentDictionary guaranteed?也指出了这种情况。

如果要排序字典,则有一个SortedDictionary类,但不是Concurrent-如果要这样做,则必须编写自己的类或使用其他方法您的代码。