2009-10-21 3 views
2

Есть ли быстрый/простой способ вычисления частотного распределения коллекции .Net с использованием Linq или иным образом?Расчет частотного распределения коллекции с .Net/C#

Например: произвольно длинный список содержит много повторений. Что такое умный способ ходить по списку и подсчитывать/отслеживать повторы?

+1

Хотите быстро или просто? –

ответ

2

Самый простой способ - использовать хэш-карту и либо использовать значение в качестве ключа, либо увеличить значение, или выберите размер ковша (ковш 1 = 1 - 10, ковш 2 = 11 - 20 и т. д.) и увеличьте каждый ковш на значение.

Затем вы можете пройти и определить частоты.

5

Самый простой способ найти дубликаты элементов в списке, чтобы сгруппировать его, как это:

var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any()); 

(Запись Skip(1).Any() должна быть быстрее, чем (Count()> 1), потому что не нужно будет пересечь более двух элементов из каждой группы. Однако разница, вероятно, незначительна, если счетчик list не работает)

+0

Почему это было приостановлено? – SLaks

1

C5 generic collections library имеет реализацию HashBag, которая допускает повторение результатов путем подсчета. Следующий псевдокод бы получить, что вы ищете:

 
var hash = new HashBag(); 
hash.AddAll(list); 
var mults = hash.ItemMultiplicities(); 

(где K это тип элементов в списке) mults будет содержать IDictionary<K,int> где элемент списка является ключом и кратность - это значение.

+0

Я не использовал C5, но в итоге написал свой собственный процесс на основе аналогичной идеи: Словарь

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