Вычисление частотного распределения коллекции с помощью .Net /C#

StackOverflow https://stackoverflow.com/questions/1598282

Вопрос

Есть ли быстрый / простой способ рассчитать частотное распределение коллекции .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> где элемент списка - это ключ, а кратность - значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top