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?

Foi útil?

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 listO 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top