Domanda

C'è un / modo semplice e veloce per calcolare la distribuzione di frequenza di una collezione Net utilizzando Linq o in altro modo?

Ad esempio: Un arbitrariamente lunga lista contiene molte ripetizioni. Che cosa è un modo intelligente di camminare della lista e il conteggio / monitoraggio ripetizioni?

È stato utile?

Soluzione

Il modo più semplice è quello di utilizzare un hashmap e utilizzare il valore come chiave e incrementare il valore oppure scegliere una taglia secchio (secchio 1 = 1 - 10, secchio 2 = 11 - 20, ecc), e incrementare ogni secchiello per il valore.

Poi si può passare attraverso e determinare le frequenze.

Altri suggerimenti

Il modo più semplice per trovare elementi duplicati in un elenco è quello di raggruppare, in questo modo:

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

(Scrittura Skip(1).Any() dovrebbe essere più veloce (Count ()> 1) perché non dovrà percorrere più di due elementi di ogni gruppo. Tuttavia, la differenza è probabilmente trascurabile a meno enumerator di list è lento)

Il C5 collezioni generici biblioteca dispone di un'implementazione HashBag che accetta duplicati contando. Il seguente pseudo-codice sarebbe ottenere ciò che stai cercando:

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

(dove K è il tipo degli elementi nel proprio elenco) mults conterrà quindi una IDictionary<K,int> in cui l'elemento della lista è la chiave e la molteplicità è il valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top