2

给定List<string>具有以下元素的 a: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();

请注意,OrderByDescending您可以使用MoreLINQMaxBy运算符代替:

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

您正在寻找“模式”(最常出现的值)对吗?

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 回答
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 回答