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 Я использовал выше.

Другие вопросы по тегам