有没有使用linq的又快又好的方法?
发布于 2008-12-10 13:05:52
这样如何:
var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Select(grp=>grp.Key).First();或者在查询语法中:
var most = (from i in list
group i by i into grp
orderby grp.Count() descending
select grp.Key).First();当然,如果您要重复使用此方法,则可以添加一个扩展方法:
public static T MostCommon<T>(this IEnumerable<T> list)
{
return ... // previous code
}然后,您可以使用:
var most = list.MostCommon();发布于 2008-12-10 13:08:38
不确定lambda表达式,但我会
n)
it
这是因为可能有不止一个出现次数最多的数字。
发布于 2013-05-31 13:01:35
摘自我的答案here
public static IEnumerable<T> Mode<T>(this IEnumerable<T> input)
{
var dict = input.ToLookup(x => x);
if (dict.Count == 0)
return Enumerable.Empty<T>();
var maxCount = dict.Max(x => x.Count());
return dict.Where(x => x.Count() == maxCount).Select(x => x.Key);
}
var modes = { }.Mode().ToArray(); //returns { }
var modes = { 1, 2, 3 }.Mode().ToArray(); //returns { 1, 2, 3 }
var modes = { 1, 1, 2, 3 }.Mode().ToArray(); //returns { 1 }
var modes = { 1, 2, 3, 1, 2 }.Mode().ToArray(); //returns { 1, 2 }我在上面的方法和David B's TakeWhile之间进行了性能测试。
源={ },迭代= 1000000
我的-300ms,David的-930ms来源={1 },迭代= 1000000
我的-1070ms,大卫的-1560ms来源= 100+ int,有2个副本,迭代= 10000
我的-300ms,大卫的-500ms源= 10000个随机整数,大约有100+个副本,迭代= 1000次
我的- 1280毫秒,大卫的- 1400毫秒
https://stackoverflow.com/questions/355945
复制相似问题