如何使用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等