下面是我一生中基本上写过几千次的示例代码:
// 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/