c# - 按值对 ConcurrentDictionary 进行排序

标签 c# c#-4.0 concurrency parallel-processing concurrent-programming

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

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

Proxies.OrderBy(p => p.Value.Speed);

这很棒,除了我想将新的重新排序的列表设置为字典,有效地对字典本身进行排序,而不是仅仅接收排序项目的结果列表。

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

Proxies = new ConcurrentDictionary<string,Proxy>(
    Proxies.OrderBy(p => p.Value.Speed));

看起来这样做对字典没有影响。我还尝试将 OrderBy 结果转换为一个新的 var,认为它可能会对委托(delegate)产生影响,但仍然没有成功。

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

最佳答案

简单的字典不是排序的集合。它们只是一个将键映射到值的集合。 ConcurrentDictionary也不异常(exception)。

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

至于您是否真的需要一个排序的“字典”,我们需要更多地了解您的用例。这是一个虚假的优先级队列吗?你能简单地使用 ConcurrentBag<Proxy> 吗?并在事后执行排序?

如果您需要获取集合并在下游并行方法中按排序顺序使用代理,我建议您查看创建一个 custom Partitioner , 可能借用 MSDN example of an OrderablePartitioner .

关于c# - 按值对 ConcurrentDictionary 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608769/

相关文章:

c# - 我可以将参数传递给 Xamarin 中的 Clicked 事件吗?

.net - 使用 C# 中的高级矩阵库计算 C# 中的特征向量。网

asp.net - 在C#背后的代码中实现javascript确认框

java - ConcurrentHashMap 中的 Dose Segment 存在虚假共享问题?

concurrency - 维护打开的 websocket 连接列表的最佳方法是什么?

C# 数据库连接字符串

c# - Microsoft Band 异常 : 0xA0D4000A

java - 当线程 A 中断线程 B 时,如何识别线程 A 的名称或任何上下文信息?

c# - 无效的 URI : The hostname could not be parsed

c# - 使用 Type 变量声明变量