List<string>
次の要素を持つ が与えられた場合:1, 2, 2, 1, 3, 3, 5, ?, , 4, A, 1, 7, 1, 9, 3
null
値と非数値を除外して、最も多く発生する数値を見つける良い方法は何ですか? LINQ は問題ありません (常に非常に効率的であるとは限りませんが、楽しいものです。:))。
私は次のようなものを使用します:
var numericPattern = new Regex(@"^-?\d+$");
var result = list.Where(x => x != null && numericPattern.Matches(x))
.GroupBy(x => x, (key, group) => new { Value = key,
Count = group.Count() } )
.OrderByDescending(pair => pair.Count)
.First();
代わりに、MoreLINQの演算子OrderByDescending
を使用できることに注意してください。MaxBy
var result = list.Where(x => x != null && digitsOnly.Matches(x))
.GroupBy(x => x, (key, group) => new { Value = key,
Count = group.Count() } )
.MaxBy(pair => pair.Count);
どちらの方法でも、結果には値と発生回数が含まれます。
(これには大きすぎて に格納できない数値が含まれることにも注意してくださいint
。実際の解析を実行したい場合は、代わりにそれを実行する必要があります。)
int mostFrequent = elements.Where(s => s != null)
.Select(s => {
int i;
bool isValid = int.TryParse(s, out i);
return new { IsValid = isValid, Value = i }
})
.Where(v => v.IsValid)
.GroupBy(i => i.Value)
.OrderByDescending(grp => grp.Count())
.First().Key
「モード」(最も頻繁に発生する値)を探していますよね?
http://msmvps.com/blogs/deborahk/archive/2010/05/07/linq-mean-median-and-mode.aspx
var mode = numbers.GroupBy(n=> n).
OrderByDescending(g=> g.Count()).
Select(g => g.Key).FirstOrDefault();
Debug.WriteLine(("Mode is: " + mode));