按Value排序ConcurrentDictionary

use*_*380 12 c# parallel-processing concurrency concurrent-programming c#-4.0

我可以像这样按值对ConcurrentDictionary进行排序:

static ConcurrentDictionary<string, Proxy> Proxies = 
    new ConcurrentDictionary<string, Proxy>();

Proxies.OrderBy(p => p.Value.Speed);
Run Code Online (Sandbox Code Playgroud)

这很好,除了我想将新的重新排序的列表设置为字典,有效地排序字典本身而不是仅仅接收已排序项的结果列表.

我尝试做这样的事情,但没有运气 - 字典仍然无序后:

Proxies = new ConcurrentDictionary<string,Proxy>(
    Proxies.OrderBy(p => p.Value.Speed));
Run Code Online (Sandbox Code Playgroud)

似乎这样做对字典没有影响.我也尝试将OrderBy结果转换为一个新的var,认为它可能对委托产生影响但仍然没有运气.

如何重新订购此ConcurrentDictionary,然后强制字典成为OrderBy的重新排序结果?

use*_*116 9

简单的词典不是排序的集合.它们只是将键映射到值的集合.ConcurrentDictionary没有什么不同.

您需要SortedConcurrentDictionary(类似于SortedDictionary),但是,此数据结构不存在.

至于如果你真的需要一个有序的"字典",我们需要听到更多关于你的用例的信息.这是一个虚假的优先队列吗?您可以简单地使用a ConcurrentBag<Proxy>并在事后执行订购吗?

如果您需要采用集合并在下游并行方法中按排序顺序使用代理,我建议您查看创建自定义分区程序,可能借用OrderablePartitionerMSDN示例.

  • 就这样,没有其他人花2个小时实现HashSet <T>,然后使用List <T>作为'已排序'查看器:.NET 4.0添加了一个'SortedSet <T>',它是一个已排序的HashSet./粉碎面式键盘 (3认同)