C# ToDictionary с проверкой ContainsKey
У меня есть список, который я хочу поместить в словарь, для простоты вводимые значения будут одинаковыми.
Я могу использовать цикл foreach.
List<string> list = new List<string>();
list.Add("Earth");
list.Add("Wind");
list.Add("Fire");
list.Add("Water");
list.Add("Water"); // Will NOT BE INSERTED using the foreach loop
var myDictionary= new Dictionary<string, int>();
foreach (string value in list)
{
if (!myDictionary.ContainsKey(value))
{
myDictionary.Add(value, 1);
}
}
Выше работает.
Но я хочу использовать ToDictionary сделать то же самое следующим образом -
Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1);
Конечно, это не удается, потому что я добавляю "Вода" дважды.
Как правильно проверять дубликаты записей при использовании ToDictionary?
2 ответа
Вы могли бы использовать Distinct()
отфильтровать дубликаты:
Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1);
Тот же подход сделает ваш традиционный цикл намного более понятным, так как вам не нужно проверять "вручную" на наличие дубликатов:
foreach (string value in list.Distinct())
{
myDictionary.Add(value, 1);
}
Distinct
это один из вариантов, который позволяет избежать проблемы дублирования ключа. Если вам нужно количество дубликатов, вы можете попробовать что-то вроде этого GroupBy
следующее:
var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());
Если ваше приложение представляет собой не просто структуру со списком строк / дубликатов, вы можете получить некоторое преимущество от выбора другой структуры, такой как Lookup
что вы можете получить от вызова ToLookup
расширение-или, возможно, происходит с такой группировкой, как GroupBy
Я использовал выше.