2013-06-20 3 views
0

Допустим, у нас есть словарь, как это:словарь не ++ работает, как ожидалось

var dic = new Dictionary<Int32, Int32>(); 

В то время как ключ является идентификатором и значение является счетчиком. Теперь мы хотим добавить новый ключ. Это отлично работает с помощью следующей строки:

dic[1] = 1; //adding ID 1, Count 1 to the current Dictionary 

Если предположить, что у нас есть список целочисленных со следующими значениями:

var ids = new List<int> {1, 2, 3 , 1, 2}; 

Где мы хотели бы получить словарь со следующим содержанием:

[1, 2] ==> (ID 1, Count 2) 
[2, 2] ==> (ID 2, Count 2) 
[3, 1] ==> (ID 3, Count 1) 

очевидным решением было бы:

foreach (var id in ids) 
{ 
    dic[id]++; 
} 

Но это метание KeyNotFoundException. Поэтому очевидно, что оператор += не поддерживается для словарей.

Я уже приложил ответ на эту проблему. Есть ли лучший способ добиться этого?

ответ

2

Мое решение:

var dic = new Dictionary<Int32, Int32>(); 
var ids = new List<int> { 1, 2, 3, 1, 2 }; 
foreach (var id in ids) 
{ 
    if (dic.ContainsKey(id)) 
    { 
     dic[id]++; 
    } else { 
     dic[id] = 1; 
    } 
} 
+0

Я думаю, что ваш 'else' должен содержать' dic.Add (идентификатор, 1); '. – CodeCaster

+0

@CodeCaster No. Это решение работает. Я протестировал его. :) –

+1

Я исправлен, [manual] (http://msdn.microsoft.com/en-us/library/9tee9ht2.aspx): _ «Вы также можете использовать свойство [indexer] для добавления новых элементов, установив значение ключа, которого нет в словаре . "_ – CodeCaster

2

Вы можете использовать LINQ для простой:

var dic = ids.GroupBy(id => id) 
      .ToDictionary(g => g.Key, g => g.Count()); 
+0

+1 для LINQ .... –

+0

Я не могу используйте LINQ. это .NET 2.0. (Добавлен тег сейчас). Но я даю вам, что это решение будет чище. ;) –

+0

@FabianBigler: как насчет [linqbridge] (http://www.albahari.com/nutshell/linqbridge.aspx), чтобы включить linq для .NET 2.0? –

Смежные вопросы