2

Linqなどを使用して.Netコレクションの頻度分布を計算する高速/簡単な方法はありますか?

例: 任意に長いリストには、多くの繰り返しが含まれます。リストをたどり、繰り返しをカウント/追跡する賢い方法は何ですか?

4

3 に答える 3

5

リスト内の重複項目を見つける最も簡単な方法は、次のようにグループ化することです。

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

(書き込みSkip(1).Any()は (Count() > 1) よりも高速である必要があります。これは、各グループから 2 つを超えるアイテムをトラバースする必要がないためです。ただし、listの列挙子が低速でない限り、その差はおそらく無視できる程度です)

于 2009-10-21T01:34:27.703 に答える
2

最も簡単な方法は、ハッシュマップを使用し、値をキーとして使用して値をインクリメントするか、バケット サイズ (バケット 1 = 1 - 10、バケット 2 = 11 - 20 など) を選択して、各バケットを価値。

次に、周波数を調べて決定できます。

于 2009-10-21T01:36:39.650 に答える
1

C5 ジェネリック コレクション ライブラリには、カウントHashBagによって重複を受け入れる実装があります。次の疑似コードは、探しているものを取得します。

var ハッシュ = 新しい HashBag();
hash.AddAll(リスト);
var mults = hash.ItemMultiplicity();

( whereKはリスト内のアイテムのタイプです)には、リスト アイテムがキーであり、多重度が値である場所がmults含まれます。IDictionary<K,int>

于 2009-11-05T18:16:57.707 に答える