按值对并发字典进行排序
本文关键字:排序 字典 并发 | 更新日期: 2023-09-27 18:18:34
我可以按值对我的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,认为它可能会对委托产生影响,但仍然没有运气。
如何对此 ConcurrentDictionary 重新排序,然后强制该字典成为 OrderBy 的重新排序结果?
简单字典不是排序集合。它们只是一个将键映射到值的集合。 ConcurrentDictionary
也不例外。
相反,您需要一个SortedConcurrentDictionary
(类似于SortedDictionary
(,但是,此数据结构不存在。
至于你是否真的需要一个排序的"字典",我们需要听到更多关于你的用例的信息。这是假优先级队列吗?您可以简单地使用ConcurrentBag<Proxy>
并在事后执行订购吗?
如果您需要获取集合并在下游并行方法中按排序顺序使用代理,我建议您查看创建自定义分区程序,可能借鉴 MSDN 的可排序分区程序示例。
,尤其是ConcurrentDictionary,本质上是未排序的。
如果需要排序集合,则需要将值存储在其他类型中,例如 SortedDictionary<T,U>
。
如果您经常在不可变类中调用它,则可能效率不高,但很简单:
Imports System.Collections.Concurrent
Public Class SortedConcurrentDictionary(Of TKey, Tvalue)
Inherits ConcurrentDictionary(Of TKey, Tvalue)
Shadows ReadOnly Property Values As IEnumerable(Of Tvalue)
Get
If MyBase.Values.Count = 0 Then
Return MyBase.Values
End If
Return From k In Keys Order By k Select Me(k)
End Get
End Property
End Class
ConcurrentDictionary
和Dictionary
一样,不知道排序的概念,即它不包含任何排序信息。OrderBy()
的结果具有特定的顺序,但是当分配给Proxies
时,订单信息将丢失。
注意有排序的实现 IDictionary
,即 SortedDictionary
和 SortedList
。
解决方案是使用经过数小时研究和代码修订后发现的SortedSet<T>
。排序集提供了Dictionary
或HashSet
的唯一性,但也允许排序 - Dictionary
和HashSet
都不允许排序。