c# - 只需一两行即可从 C# 3.5 中的集合中返回最合适的项目

标签 c# linq max

下面是我一生中基本上写过几千次的示例代码:

// find bestest thingy
Thing bestThing;
float bestGoodness = FLOAT_MIN;
foreach( Thing x in arrayOfThings )
{
  float goodness = somefunction( x.property, localvariable );
  if( goodness > bestGoodness )
  {
    bestGoodness = goodness;
    bestThing = x;
  }
}
return bestThing;

而且在我看来,C# 应该已经可以在一行中完成此操作。像这样的东西:

return arrayOfThings.Max( delegate(x)
  { return somefunction( x.property, localvariable ); });

但这不会返回事物(或事物的索引,这很好),它会返回拟合优度值。

所以也许是这样的:

var sortedByGoodness = from x in arrayOfThings 
  orderby somefunction( x.property, localvariable ) ascending 
  select x;
return x.first;

但这是对整个数组进行整体排序,可能太慢了。

这个存在吗?

最佳答案

这是您可以使用 System.Linq 执行的操作:

var value = arrayOfThings
    .OrderByDescending(x => somefunction(x.property, localvariable))
    .First();

如果数组可以为空,使用.FirstOrDefault();来避免异常。

你真的不知道这是如何在内部实现的,所以你不能保证这将对整个数组进行排序以获得第一个元素。例如,如果是 linq to sql,服务器会收到一个包含排序和条件的查询。它不会获取数组,然后对其进行排序,然后获取第一个元素。

事实上,除非您不调用 First,否则不会评估查询的第一部分。我的意思是这不是两步评估,而是一步评估。

var sortedValues =arrayOfThings
  .OrderByDescending(x => somefunction(x.property, localvariable));
// values isn't still evaluated
var value = sortedvalues.First();
// the whole expression is evaluated at this point.

关于c# - 只需一两行即可从 C# 3.5 中的集合中返回最合适的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814660/

相关文章:

C# 阻止条目所以你不会得到 "Index was outside the bounds of the array"

c# - 为什么 Linq 扩展方法不位于 IEnumerator 而不是 IEnumerable 上?

c# - 使用 LINQ 从列表中随机选择一个匹配的字符串

python - 给定一个类型为 `scipy.sparse.coo_matrix` 的矩阵,如何确定每一行的索引和最大值?

mysql - 如何将以下数据表转换为另一种结构

c# - 使 UserControl 删除自身

c# - 在 platform.uno 项目中引用 .netstandard2_0 项目

c# - 如何获取枚举的属性

c# - 动态生成 LINQ(成员)表达式

Python.比较两个列表中的数字并找到最大值