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、このデータ構造は存在しません。

ソートされた「辞書」が実際に必要な場合は、ユースケースについて詳しく聞く必要があります。これは偽の優先キューですか?単純にを使用してConcurrentBag<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 は、本質的にソートされていません。

並べ替えられたコレクションが必要な場合は、値を a などの他の型に格納する必要がありますSortedDictionary<T,U>

于 2011-12-22T19:28:44.247 に答える
0

ConcurrentDictionaryは、 と同様Dictionaryに、並べ替えの概念を認識していません。つまり、順序情報は含まれていません。の結果にOrderBy()は特定の順序がありますが、順序情報に割り当てられるProxiesと失われます。

のソートされた実装IDictionary、つまりSortedDictionaryとがあることに注意してくださいSortedList

于 2011-12-22T19:28:30.277 に答える
0

SortedSet<T>解決策は、何時間もの調査とコード修正の後に発見されたを使用することです。Dictionaryソート済みセットは、またはの一意性を提供しますが、HashSetソートも許可します。 も もソートDictionaryを許可しませんHashSet

于 2011-12-23T05:39:55.570 に答える