これが私の配列です:
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
プログラムにこの配列のモードを見つけさせたい場合、何を書かなければなりませんか?
LINQ ソリューションは次のとおりです。
int mode = myArray
.GroupBy(x => x)
.OrderByDescending(g => g.Count())
.First() // throws InvalidOperationException if myArray is empty
.Key;
これにより、要素がmyArray
値でグループ化され、各グループの値の数でグループが並べ替えられ、最初のグループの値が取得されます。複数のモードがある場合、これは で最初に発生する (インデックスが最も小さい) ものを使用しmyArray
ます。
複数のモードがあり、それらすべてが必要な場合は、代わりに次のバリエーションを使用できます。
var groups = myArray
.GroupBy(x => x)
.Select(g => new { Value = g.Key, Count = g.Count() })
.ToList(); // materialize the query to avoid evaluating it twice below
int maxCount = groups.Max(g => g.Count); // throws InvalidOperationException if myArray is empty
IEnumerable<int> modes = groups
.Where(g => g.Count == maxCount)
.Select(g => g.Value);
これは、 の要素をmyArray
値でグループ化し、グループ内の値の最大数を見つけ、その最大数の値を持つすべてのグループの値を取得します。
myArray
が非常に大きい場合、2 番目のバージョン (O(n)) は最初のバージョン (ソートにより O(n log n)) よりも高速になる可能性があります。