c# - 如何在 LINQ 中执行 'search a take best' 函数?

标签 c# linq

您好!

我正在寻找一种方法来在集合中搜索最符合我条件的对象。由于我必须经常这样做,所以我一直在研究如何使用 LINQ 执行查询,但找不到一种不会“看起来”浪费时间的简单方法来执行此操作。

一个功能性的实现是:

collection.OrderByDescending(f => FitFunction(f)).First()

但这似乎不必要地进行了排序。我真的只需要线性扫描。 Min LINQ 函数返回最佳拟合,而不是生成最佳拟合的对象,因此似乎没有用。

为清楚起见,我传统上会编写的非 LINQ 代码(并且已经编写了很多次):

T best;
float bestFit = something very low;

foreach (T ob in collection)
{
  float fit = FitFunction(ob);
  if (fit > bestFit)
  {
    bestFit = fit;
    best = ob;
  }
}
return best;

而且我想我可能只是制作自己的扩展方法来做到这一点;但在我看来,在 LINQ 中必须已经有一种方法可以做到这一点。

谢谢!

最佳答案

这本质上是一个基于谓词的 Top-N 问题,附加约束条件是 N 始终等于 1。不幸的是,没有内置的 LINQ 运算符执行 TopN()操作...但是正如您所指出的,自己编写一个操作并不难。

MoreLINQ库有一个实现 MaxBy()运算符,它允许您指定一个谓词 - 并且也可以工作。

关于c# - 如何在 LINQ 中执行 'search a take best' 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4168849/

相关文章:

c# - VStudio 2019 中缺少 “Merge changes in merge tool” 、 “Take server version” 等按钮

c# - 在没有 Visual Studio 的情况下在 Rider 中使用 NuGet

c# - LINQ 将多个 IEnumerables 聚合为一个?

c# - 访问 EnumerableRowCollection

c# - 从数据库中获取特定时间间隔的值

c# - 无法将类型 'bool' 隐式转换为 'system.threading.tasks.task bool'

c# - LINQ 查询中的自定义排序

c# - 仅获取 WCf 消息的正文

c# - 如何调试与低级 API(如 I/O 完成端口)交互的代码?

c# - 在构造期间访问匿名类型的成员