Как я могу преобразовать ConcurrentDictionary в словарь? - PullRequest
23 голосов
/ 02 декабря 2010

У меня есть объект ConcurrentDictionary, который я хотел бы установить в объект Dictionary.

Кастинг между ними не разрешен.Так как мне это сделать?

Ответы [ 4 ]

35 голосов
/ 02 декабря 2010

Класс 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);
12 голосов
/ 02 декабря 2010

Зачем вам нужно преобразовать его в словарь?ConcurrentDictionary<K, V> реализует интерфейс IDictionary<K, V>, этого недостаточно?

Если вам действительно нужен Dictionary<K, V>, вы можете скопировать , используя LINQ:

var myDictionary = myConcurrentDictionary.ToDictionary(entry => entry.Key,
                                                       entry => entry.Value);

Обратите внимание, что это делает копию .Вы не можете просто назначить ConcurrentDictionary словарю, поскольку ConcurrentDictionary не является подтипом словаря.В этом весь смысл интерфейсов, таких как IDictionary: вы можете абстрагировать желаемый интерфейс («своего рода словарь») от конкретной реализации (одновременный / не одновременный хэш-файл).

6 голосов
/ 02 декабря 2010

Я думаю, что нашел способ сделать это.

ConcurrentDictionary<int, int> concDict= new ConcurrentDictionary<int, int>( );
Dictionary dict= new Dictionary<int, int>( concDict);
0 голосов
/ 02 декабря 2010
ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();
Dictionary<int,string> d = cd.ToDictionary(pair => pair.Key, pair => pair.Value);
...