Во-первых, об использовании метода.
Бросить приведение, вызвать ToList()
в результате метода.Результат метода IEnumerable<string>
, это не List<string>
.Тот факт, что источник изначально a List<string>
не имеет значения, вы не возвращаете список, вы yield return
последовательность.
d[kvp.Key] = deDuplicateCollection(kvp.Value).ToList();
Во-вторых, ваш deDuplicateCollection
методявляется избыточным, Distinct()
уже существует в библиотеке и выполняет ту же функцию.
d[kvp.Key] = kvp.Value.Distinct().ToList();
Просто убедитесь, что у вас есть using System.Linq;
в директивах, чтобы вы могли использовать эти Distinct()
и ToList()
методы расширения.
Наконец, вы заметите, что, сделав это изменение в одиночку , вы столкнетесь с новым исключением при попытке изменить словарь в цикле.Вы не можете обновить коллекцию в foreach
.Самый простой способ сделать то, что вы хотите, это полностью пропустить явный цикл.Рассмотрим
d = d.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Distinct().ToList());
При этом используется другой метод расширения Linq, ToDictionary()
.Примечание: это создает новый словарь в памяти и обновляет d
для ссылки на него.Если вам нужно сохранить исходный словарь, на который ссылается d
, то вам нужно подойти к этому по-другому.Простым вариантом здесь является создание словаря для тени d
, а затем обновление d
с ним.
var shadow = new Dictionary<string, string>();
foreach (var kvp in d)
{
shadow[kvp.Key] = kvp.Value.Distinct().ToList();
}
foreach (var kvp in shadow)
{
d[kvp.Key] = kvp.Value;
}
Эти два цикла безопасны, но вы видите, что вам нужно дважды выполнить цикл, чтобы избежать проблемы обновления исходной коллекции при ее перечислении и сохранения исходной коллекции в памяти.