给定List<string>
具有以下元素的 a: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();
请注意,OrderByDescending
您可以使用MoreLINQ的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
- 如果您想执行实际解析,则应该这样做。)
您正在寻找“模式”(最常出现的值)对吗?
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));
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