C#の配列から重複した値を返す方法はありますか?また、配列内で最も多くの重複値を返す小さなアルゴリズムを作成しようとしています。例えば
[1、2,2,2 3,3]出現回数が最も多く、出現回数も多い重複値を返す必要があります。
Linqを使用して実行できるという投稿を見たと思いますが、Linqが何であるかわかりません。
どんな助けでも大歓迎です。
これを試して:
int[] data = new int[] { 1, 2, 2, 2, 3, 3 };
IGrouping<int, int> mostOccurrences = data
.GroupBy(value => value)
.OrderByDescending(group => group.Count())
.First();
Console.WriteLine("Value {0} occurred {1} time(s).", mostOccurrences.Key, mostOccurrences.Count());
複数の値が同じ回数発生する場合(そのリストにさらに3つ追加した場合など)、上記のコードはそのうちの1つのみをリストすることに注意してください。そのような状況に対処するには、次のことを試してください。
int[] data = new int[] { 1, 2, 2, 2, 3, 3, 3 };
var occurrenceInfos = data
.GroupBy(value => value)
.Select(group =>
new {
Count = group.Count(),
Value = group.Key
}
);
int maxOccurrenceCount = occurrenceInfos.Max(info => info.Count);
IEnumerable<int> maxOccurrenceValues = occurrenceInfos
.Where(info => info.Count == maxOccurrenceCount)
.Select(info => info.Value);
foreach (int value in maxOccurrenceValues)
Console.WriteLine("Value {0} occurred {1} time(s).", value, maxOccurrenceCount);
これについての私の見解は次のとおりです。
var data = new[] { 1, 2, 2, 2, 3, 3, };
var occurences =
data
.ToLookup(x => x)
.ToDictionary(x => x.Key, x => x.Count());
var mostOccurences =
occurences
.OrderByDescending(x => x.Value)
.First();
これらにより、次の結果が得られます。