Вычисление частотного распределения коллекции с помощью .Net /C#
-
22-09-2019 - |
Вопрос
Есть ли быстрый / простой способ рассчитать частотное распределение коллекции .Net с использованием Linq или иным способом?
Например:Сколь угодно длинный список содержит много повторений.Какой умный способ пройтись по списку и подсчитать / отследить повторения?
Решение
Самый простой способ — использовать хэш-карту и либо использовать значение в качестве ключа и увеличивать значение, либо выбрать размер корзины (корзина 1 = 1–10, корзина 2 = 11–20 и т. д.) и увеличивать каждую корзину на ценить.
Потом можно пройтись и определить частоты.
Другие советы
Самый простой способ найти повторяющиеся элементы в списке — сгруппировать его, например:
var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());
(Письмо Skip(1).Any()
должно быть быстрее, чем (Count() > 1), поскольку ему не придется проходить более двух элементов из каждой группы.Однако разница, вероятно, незначительна, если только list
перечислитель работает медленно)
Тот Самый Библиотека универсальных коллекций C5 имеет HashBag
реализация, которая принимает дубликаты путем подсчета.Следующий псевдокод даст вам то, что вы ищете:
var hash = new HashBag(); hash.AddAll(list); var mults = hash.ItemMultiplicities();
(где K
это тип элементов в вашем списке) mults
затем будет содержать IDictionary<K,int>
где элемент списка - это ключ, а кратность - значение.