2013-12-17 5 views
-1

Как я могу заполнить данные от Dictionary до ConcurrentDictionary.Заполнять ConcurrentDictionary из Словаря

Я следующий,

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

var names = new List<Employee> 
{ 
    new Employee { Id = 1, Name = "Name1" }, 
    new Employee { Id = 1, Name = "Name1" }, 
    new Employee { Id = 2, Name = "Name2" }, 
    new Employee { Id = 3, Name = "Name3" }, 
}; 

и я заселить в Dictionary как,

Dictionary<int, List<Employee>> dict = names.GroupBy(n => n.Id).ToDictionary(g => g.Key, g => g.ToList()); 

и я хочу создать,

ConcurrentDictionary<int, List<Employee>> concDict 

и я попытался,

ConcurrentDictionary<int, List<Employee>> concDict = new ConcurrentDictionary<int, List<Employee>>(); 
dict.ToList().ForEach(e => concDict.TryAdd(e.Key, e.Value)); 

Есть ли какой-либо встроенный метод расширения, например .ToDictionary?

+0

@ Вниз/Закрыть Избиратель. Я в порядке для голосования. Вы смеете комментировать? –

ответ

3

Вы можете передать Dictionary<T> в один из ConcurrentDictionary<T>constructors.

Я не думаю, что есть метод расширения, чтобы сделать это напрямую, но его не должно быть слишком сложно написать, если вы хотите избежать создания дополнительного объекта.

public static ConcurrentDictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) 
{ 
    var dictionary = new ConcurrentDictionary<TKey, TElement>(); 
    foreach (TSource local in source) 
    { 
     dictionary.TryAdd(keySelector(local), elementSelector(local)); 
    } 
    return dictionary; 
} 
+0

Это словарь.TryAdd(). не словарь.Add(). Пожалуйста, исправьте это. –

+0

Извините, у меня есть LinqPad для .NET 3.5, который не имеет ConcurrentDictionary. Я основал пример на 'ToDictionary'. Я отредактирую код. – TheEvilPenguin

+0

Спасибо за решение. :) –

Смежные вопросы