我在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的问题)
答案 0 :(得分:0)
Dictionary
(https://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
-如果要这样做,则必须编写自己的类或使用其他方法您的代码。