Linqなどを使用して.Netコレクションの頻度分布を計算する高速/簡単な方法はありますか?
例: 任意に長いリストには、多くの繰り返しが含まれます。リストをたどり、繰り返しをカウント/追跡する賢い方法は何ですか?
Linqなどを使用して.Netコレクションの頻度分布を計算する高速/簡単な方法はありますか?
例: 任意に長いリストには、多くの繰り返しが含まれます。リストをたどり、繰り返しをカウント/追跡する賢い方法は何ですか?
リスト内の重複項目を見つける最も簡単な方法は、次のようにグループ化することです。
var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());
(書き込みSkip(1).Any()
は (Count() > 1) よりも高速である必要があります。これは、各グループから 2 つを超えるアイテムをトラバースする必要がないためです。ただし、list
の列挙子が低速でない限り、その差はおそらく無視できる程度です)
最も簡単な方法は、ハッシュマップを使用し、値をキーとして使用して値をインクリメントするか、バケット サイズ (バケット 1 = 1 - 10、バケット 2 = 11 - 20 など) を選択して、各バケットを価値。
次に、周波数を調べて決定できます。
C5 ジェネリック コレクション ライブラリには、カウントHashBag
によって重複を受け入れる実装があります。次の疑似コードは、探しているものを取得します。
var ハッシュ = 新しい HashBag(); hash.AddAll(リスト); var mults = hash.ItemMultiplicity();
( whereK
はリスト内のアイテムのタイプです)には、リスト アイテムがキーであり、多重度が値である場所がmults
含まれます。IDictionary<K,int>