2

List<string>次の要素を持つ が与えられた場合:1, 2, 2, 1, 3, 3, 5, ?, , 4, A, 1, 7, 1, 9, 3

null値と非数値を除外して、最も多く発生する数値を見つける良い方法は何ですか? LINQ は問題ありません (常に非常に効率的であるとは限りませんが、楽しいものです。:))。

4

3 に答える 3

6

私は次のようなものを使用します:

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。実際の解析を実行したい場合は、代わりにそれを実行する必要があります。)

于 2012-07-04T19:43:51.020 に答える
1
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
于 2012-07-04T19:44:12.607 に答える
1

「モード」(最も頻繁に発生する値)を探していますよね?

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)); 
于 2012-07-04T19:42:55.467 に答える