13

我可以像这样按值对我的 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 的重新排序结果?

4

5 回答 5

11

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

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

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

如果您需要收集集合并在下游并行方法中按排序顺序使用代理,我建议您查看创建自定义 Partitioner,可能从OrderablePartitioner 的 MSDN 示例中借用。

于 2011-12-22T19:33:56.620 回答
3

如果您经常在不可变类中调用它,可能效率不高,但很简单:

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
于 2012-11-17T21:05:07.487 回答
2

字典,尤其是 ConcurrentDictionary,本质上是未排序的。

如果需要排序集合,则需要将值存储为其他类型,例如SortedDictionary<T,U>.

于 2011-12-22T19:28:44.247 回答
0

ConcurrentDictionary,就像Dictionary,不知道排序的概念,即它不包含任何排序信息。的结果OrderBy()具有特定的订单,但分配给Proxies订单信息时会丢失。

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

于 2011-12-22T19:28:30.277 回答
0

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

于 2011-12-23T05:39:55.570 回答