私は、Dictionaryオブジェクトに設定したいConcurrentDictionaryオブジェクトを持っています。どのようにConcurrentDictionaryをDictionaryに変換できますか?
これらの間のキャストは許可されていません。それで私はどうしますか?
私は、Dictionaryオブジェクトに設定したいConcurrentDictionaryオブジェクトを持っています。どのようにConcurrentDictionaryをDictionaryに変換できますか?
これらの間のキャストは許可されていません。それで私はどうしますか?
ConcurrentDictionary<K,V>
クラスはほとんどの要件で十分であるIDictionary<K,V>
インターフェイスを実装しています。あなたが本当に具体的なDictionary<K,V>
...
var newDictionary = yourConcurrentDictionary.ToDictionary(kvp => kvp.Key,
kvp => kvp.Value,
yourConcurrentDictionary.Comparer);
// or...
// substitute your actual key and value types in place of TKey and TValue
var newDictionary = new Dictionary<TKey, TValue>(yourConcurrentDictionary, yourConcurrentDictionary.Comparer);
なぜそれを辞書に変換する必要がありますか? ConcurrentDictionary<K, V>
はIDictionary<K, V>
インターフェイスを実装していますが、十分ではありませんか?
あなたが本当にそれはLINQを使用してすることができます、コピーをDictionary<K, V>
が必要な場合:
var myDictionary = myConcurrentDictionary.ToDictionary(entry => entry.Key,
entry => entry.Value);
注意これはコピーを作ること。 ConcurrentDictionaryは辞書のサブタイプではないので、ConcurrentDictionaryを辞書に割り当てることはできません。それはIDictionaryのようなインターフェイスの全ポイントです。具体的な実装(並行/非並行ハッシュマップ)から、望ましいインターフェイス(「ある種の辞書」)を抽象化することができます。
ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();
Dictionary<int,string> d = cd.ToDictionary(pair => pair.Key, pair => pair.Value);
が必要な場合が、私はそれを行うための方法を発見したと思います。
ConcurrentDictionary<int, int> concDict= new ConcurrentDictionary<int, int>();
Dictionary dict= new Dictionary<int, int>(concDict);
コピーする辞書に、そのように保存されない非デフォルトの「IEqualityComparer」を使用することがあります。 Better: 'var newDict = dict.ToDictionary(kvp => kvp.Key、kvp => kvp.Value、dict.Comparer); ' –
[MSDN](https://msdn.microsoft.com/ja)に注意してください。 -us/library/system.collections.concurrent(v = vs.110).aspx)は、これはスレッドセーフではないと言います。どのようにスレッドセーフなものにしますか? – JonDrnek
実際には、ConcurrentDictionaryのおかげでスレッドセーフです。 ConcurrentDictionaryのコンテンツのスナップショットを取得します。あなたが得た辞書は、後でスレッドセーフではありません。 – Falanwe