2012-01-21 3 views
3

В C# у меня есть список, который содержит числа в строковом формате. Каков наилучший способ подсчитать все эти цифры? Например, чтобы сказать, что я три раза число десять ..Число чисел в списке

Я имею в виду в UNIX AWK вы можете сказать что-то вроде

tempArray["5"] +=1 

он похож на KeyValuePair, но это только для чтения.

Любой быстрый и умный способ?

ответ

2

(Как отмечено в ответе digEmAll, я уверен, если вы на самом деле не волнует, что они номера. - все, что здесь предполагается, что вы хотели, чтобы рассматривать их как строки)

простейший способ сделать это состоит в использовании LINQ:

var dictionary = values.GroupBy(x => x) 
         .ToDictionary(group => group.Key, group => group.Count()); 

Вы могли построить словарь самостоятельно, как это:

var map = new Dictionary<string, int>(); 
foreach (string number in list) 
{ 
    int count; 
    // You'd normally want to check the return value, but in this case you 
    // don't care. 
    map.TryGetValue(number, out count); 
    map[number] = count + 1; 
} 

... но я предпочитаю лаконичность подхода LINQ :) Это будет немного менее эффективно, заметьте - если это проблема, я лично, вероятно, создаю общий метод расширения «подсчета»:

public static Dictionary<T, int> GroupCount<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    var map = new Dictionary<T, int>(); 
    foreach (T value in source) 
    { 
     int count; 
     map.TryGetValue(number, out count); 
     map[number] = count + 1; 
    } 
    return map; 
} 

(вы могли бы хотеть другую перегрузку, принимающую IEqualityComparer<T>.) Написав этот раз, вы можете использовать его в любое время вам нужно, чтобы получить отсчеты для элементов:

var counts = list.GroupCount(); 
6

Очень легко с помощью LINQ:

var occurrenciesByNumber = list.GroupBy(x => x) 
           .ToDictionary(x => x.Key, x.Count()); 

Конечно, будучи вашими числами, представленными в виде строк, этот код различает, например, между и "1", даже если концептуально одинаковое число.

Для подсчета числа, которые имеют такое же значение, вы могли бы сделать, например:

var occurrenciesByNumber = list.GroupBy(x => int.Parse(x)) 
           .ToDictionary(x => x.Key, x.Count()); 
Смежные вопросы