Distribuição de frequência de cálculo de uma coleção com .NET/C#
-
22-09-2019 - |
Pergunta
Existe uma maneira rápida/simples de calcular a distribuição de frequência de uma coleção .NET usando LINQ ou não?
Por exemplo: Uma lista arbitrariamente longa contém muitas repetições. Qual é uma maneira inteligente de caminhar pela lista e contar/rastrear repetições?
Solução
A maneira mais fácil é usar um hashmap e usar o valor como a chave e incrementar o valor, ou escolher um tamanho de balde (balde 1 = 1 - 10, balde 2 = 11 - 20, etc. valor.
Então você pode passar e determinar as frequências.
Outras dicas
A maneira mais simples de encontrar itens duplicados em uma lista é agrupar -a, assim:
var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());
(Escrita Skip(1).Any()
deve ser mais rápido que (count ()> 1), porque não precisará atravessar mais de dois itens de cada grupo. No entanto, a diferença provavelmente é insignificante, a menos que list
O enumerador é lento)
o Biblioteca de coleções genéricas C5 tem um HashBag
implementação que aceita duplicatas contando. O seguinte pseudo-código faria com você o que você está procurando:
var hash = new HashBag(); hash.AddAll(list); var mults = hash.ItemMultiplicities();
(Onde K
é o tipo de itens da sua lista) mults
então conterá um IDictionary<K,int>
Onde o item da lista é a chave e a multiplicidade é o valor.