如何使用linqfind最小值
我有一个class A { public float Score; ... }
class A { public float Score; ... }
和一个IEnumerable<A> items
并希望findA
分数最低。
使用items.Min(x => x.Score)
给出了最低分数,而不是最低分数的实例。
我怎样才能通过我的数据迭代一次获得实例?
编辑 :只要有三个主要的解决scheme:
-
写一个扩展方法(由Svish提出)。 优点 :易于使用和评估每个项目只有一次分数。 缺点 :需要扩展方法。 (我为我的应用程序select了这个解决scheme。)
-
使用Aggregate(由Daniel Renshaw提出)。 优点 :使用内置的LINQ方法。 缺点 :对未经训练的眼睛稍微混淆,并多次呼叫评估者。
-
实现IComparable(由cyberzed提出)。 优点 :可以直接使用Linq.Min。 缺点 :固定为一个比较器 – 执行最小计算时不能自由select比较器。
看看MoreLINQ中的MinBy扩展方法(由Jon Skeet创build,现在主要由Atif Aziz维护)。
-
MinBy文档
-
MinBy源代码 (它非常简单,并且不依赖于其他文件)。
使用聚合:
items.Aggregate((c, d) => c.Score < d.Score ? c : d)
正如所build议的那样,用更友好的名字完全一样:
items.Aggregate((minItem, nextItem) => minItem.Score < nextItem.Score ? minItem : nextItem)
尝试items.OrderBy(s => s.Score).FirstOrDefault();
这可以用一个简单的迭代来解决:
float minScore = float.MaxValue; A minItem = null; foreach(A item in items) { if(item.Score < minScore) minItem = item; } return minItem;
这不是一个很好的LINQ查询,但它确实避免了sorting操作,只按照问题的要求迭代列表一次。
我看到它的快速方法将为您的A类实施IComparable(如果可能的话)
class A : IComparable<A>
这是一个简单的实现,你可以在CompareTo(A other)
看看MSDN上IEnumerable(of T).Min的参考指南
有一点应该做的:
var minItem = items.Aggregate((acc, c) => acc.Score < c.Score? acc : c);
啊…太慢了。
杰米彭尼得到了我的投票。 你也可以说
items.OrderBy(s => s.Score).Take(1);
这有同样的效果。 使用Take(5)取最低5等