2013-11-19 5 views
1

Хорошо, поэтому я в основном создаю некоторые алгоритмы для факторинговых чисел и сохраняю указанные факторы в списке.Подсчет количества вхождений каждого отдельного значения списка

Так что для многих, как 24, список факторов будет выглядеть следующим образом:

л = {2, 2, 2, 3}

В связи с тем, что я» m, работая с очень большими числами, мне нужен способ эффективно найти, сколько раз каждое другое значение происходит в списке. В этом базовом примере 2 происходит 3 раза, а 3 - 1 раз.

Есть ли список C# <> функция, которая может это сделать для меня?

ответ

4

Попробуйте это:

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

Он будет производить словарь с номером и сосчитать

+0

Люблю тебя, спасибо ^^. Я отвечу как ответ, как только смогу - 6 минут. –

+2

Однако это всегда создает новый словарь. Поэтому, если вы используете этот код для каждого нового номера, он будет ужасно неэффективным. @CataVisan: отредактировал мой ответ, чтобы показать другой подход, используя словарь. –

1

Вы можете использовать GroupBy и словарь:

Dictionary<int, int> numGroups = l 
    .GroupBy(i => i) 
    .ToDictionary(g => g.Key, g => g.Count()); 

Теперь вы можете использовать этот словарь для поиска в:

int number = 2; 
int count = 0; 
numGroups.TryGetValue(number, out count); 
Console.Write("List contains {0} {1} times.", number, count); 

Однако для этого нужно создать новый словарь на каждом новом номере, я предполагаю, что это недостаточно эффективно. Таким образом, вы должны использовать тот же словарь и добавлять/увеличивать число, например, таким образом:

Dictionary<int, int> NumberLookup = new Dictionary<int, int>(); 

public void CalculcateNextFactor() 
{   
    int nextNumber = // calculate the next number... 
    if (NumberLookup.ContainsKey(nextNumber)) 
     NumberLookup[nextNumber]++; 
    else 
     NumberLookup.Add(nextNumber, 1); 
} 

Если вы хотите, счетчик для заданного числа вы можете использовать TryGetValue как в первом подходе:

int count = 0; 
NumberLookup.TryGetValue(number, out count); 
Смежные вопросы