2016-05-30 4 views
0

Документация MSDN на ToDictionary() не говорит о том, как она работает. Мне интересно, создает ли он копию словаря и его элементов или просто повторно использует те же ссылки и перечислитель.Создает ли ToDictionary() копию или ссылку?

Например, если у меня есть ConcurrentDictionary c и создать словарь d, вызывая c.ToDictionary(...), могу ли я использовать (думаю foreach) d независимо друг от друга (в поточно-образом) потоков обновляемых c?

В самом деле, когда я делаю это, я получаю:

Коллекция была изменена; операция перечисления может не выполняться.

... при сериализации d.

+0

Он просто перечисляет ваш IEnumerable с инструкцией foreach, если вы спросите об этом, но перечисление ConcurrentDictionary является потокобезопасным и не должно вызывать исключение, о котором вы упомянули. – Evk

+0

Нет, я спрашиваю: если я перечислил словарь, созданный из ConcurrentDictionary, является ли это потокобезопасным при обновлении исходного ConcurrentDictionary? – Gigi

+2

Они никоим образом не связаны - когда вы добавляете новый элемент в ConcurrentDictionary, ваш другой диктатор не затрагивается. – Evk

ответ

2

Enumerable.ToDictionary создает мелкую копию вашей коллекции.

Вы можете увидеть это поведение в .NET Reference source:

public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer) 
{ 
    if (source == null) throw Error.ArgumentNull("source"); 
    if (keySelector == null) throw Error.ArgumentNull("keySelector"); 
    if (elementSelector == null) throw Error.ArgumentNull("elementSelector"); 
    Dictionary<TKey, TElement> d = new Dictionary<TKey, TElement>(comparer); 
    foreach (TSource element in source) d.Add(keySelector(element), elementSelector(element)); 
    return d; 
} 

Как вы можете видеть, это создает новые Dictionary, перебирает свою коллекцию, и добавляет все элементы к ней, применяя селекторные функции. Поэтому, если вы обновите свою оригинальную коллекцию, словарь не будет обновлен, и наоборот.

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