如何使用linq找到最小值

Dan*_*vil 42 c# linq

我有一个class A { public float Score; ... }和一个,IEnumerable<A> items并希望找到A最低分.

使用items.Min(x => x.Score)给出最小分数而不是具有最小分数的实例.

如何只通过迭代一次数据来获取实例?

编辑:这么长时间有三个主要解决方案:

  • 编写扩展方法(由Svish提出).优点:易于使用和评估每个项目只有一次得分.缺点:需要扩展方法.(我为我的申请选择了这个解决方案.)

  • 使用Aggregate(由Daniel Renshaw提出).优点:使用内置的LINQ方法.缺点:对未经训练的眼睛略微混淆并且不止一次地给评估者打电话.

  • 实施IC Comparable(由网络化提出).优点:可以直接使用Linq.Min.缺点:固定为一个比较器 - 在执行最小计算时无法自由选择比较器.

Dan*_*haw 65

使用聚合:

items.Aggregate((c, d) => c.Score < d.Score ? c : d)
Run Code Online (Sandbox Code Playgroud)

正如所建议的,完全相同的行与更友好的名称:

items.Aggregate((minItem, nextItem) => minItem.Score < nextItem.Score ? minItem : nextItem)
Run Code Online (Sandbox Code Playgroud)

  • LINQ的一些新手可能会发现使用更有意义的变量名有助于理解这里发生了什么:`items.Aggregate((minItem,nextItem)=> minItem.Score <nextItem.Score?minItem:nextItem)`. (28认同)
  • 有趣的答案.虽然它是非常不透明的 - 如果我还不知道它在做什么,我会对该代码的意图感到困惑. (3认同)

Jam*_*ney 22

尝试 items.OrderBy(s => s.Score).FirstOrDefault();

  • 简洁,但要谨慎分类; 这是一个"缓慢"的操作.如果元素的数量很大,我会建议进行基准测试,以确保性能可以接受. (8认同)
  • 这不会只迭代一次!它是O(n log n)而不是O(n). (3认同)

Svi*_*ish 14

看一看在MinBy在扩展方法MoreLINQ(由乔恩飞碟双向,现在主要通过与Atif阿齐兹维护创建).


Pau*_*ner 7

这可以通过一点点简单的迭代来解决:

float minScore = float.MaxValue;
A minItem = null;

foreach(A item in items)
{
   if(item.Score < minScore)
       minItem = item;
}

return minItem;
Run Code Online (Sandbox Code Playgroud)

这不是一个很好的LINQ查询,但它确实避免了排序操作,只根据问题的要求迭代列表一次.