c # ToDictionary с проверкой ContainsKey - PullRequest
7 голосов
/ 29 марта 2012

У меня есть список, который я хочу поместить в словарь, для простоты вводимые значения будут одинаковыми.

Я могу использовать цикл 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 ]

14 голосов
/ 29 марта 2012

Вы можете использовать Distinct(), чтобы отфильтровать дубликаты:

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1);

Тот же подход сделает ваш традиционный цикл намного более понятным, так как вам не нужно проверять «вручную» на наличие дубликатов:

foreach (string value in list.Distinct())
{
    myDictionary.Add(value, 1);
}
7 голосов
/ 30 марта 2012

Distinct - это одна из опций, которая позволяет избежать дублирования ключа.Если вам нужно количество дубликатов, вы можете попробовать что-то более похожее на GroupBy следующим образом:

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());

Если ваше приложение не просто структура списка строк / дубликатов, вы можете получитьнекоторое расстояние от выбора другой структуры, такой как Lookup, которую можно получить, вызвав расширение ToLookup, или, возможно, с группировкой, подобной GroupBy, которую я использовал выше.

...