按值对并发字典进行排序

本文关键字:排序 字典 并发 | 更新日期: 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

ConcurrentDictionaryDictionary一样,不知道排序的概念,即它不包含任何排序信息。OrderBy()的结果具有特定的顺序,但是当分配给Proxies时,订单信息将丢失。

注意有排序的实现 IDictionary ,即 SortedDictionarySortedList

解决方案是使用经过数小时研究和代码修订后发现的SortedSet<T>。排序集提供了DictionaryHashSet的唯一性,但也允许排序 - DictionaryHashSet都不允许排序。