2012-03-29 3 views
7

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

Я могу использовать петлю 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?

ответ

14

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

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

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

foreach (string value in list.Distinct()) 
{ 
    myDictionary.Add(value, 1); 
} 
+6

Это будет работать, но мне интересно, действительно ли ОП хочет набор. – Gabe

+0

@Gabe: Не уверен, что я не понимаю ваши комментарии в контексте вопроса - можете ли вы уточнить? – BrokenGlass

+1

Словарь, где все значения равны 1, является по существу просто набором. Если пользователь никогда не обращается к значениям, фактический словарь не нужен. – Gabe

7

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

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

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