Calcolo distribuzione di frequenza di una collezione con Net / C #
-
22-09-2019 - |
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?
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.