考虑以下c#行:
var item = listOfItems.FirstOrDefault(i => GetResult(i) <= upperLimit);
我的问题是,是否有一种方法可以从该行内获得GetResult(i)
的返回值?
显而易见的答案是有两行:
var item = listOfItems.FirstOrDefault(i => GetResult(i) <= upperLimit);
var result = GetResult(item);
但是调用同一个函数两次似乎有点低效…有一种方法可以用一次呼叫获得result
吗?
您可以这样使用(假设GetResult
返回int
):
int? result = null;
var item = listOfItems.FirstOrDefault(x => (result = GetResult(x)) <= upperLimit);
此解决方案将保持FirstOrDefault
的惰性:它将在第一次找到匹配时停止。
您可以同时选择项目和在匿名类型的项目上调用GetResult
的结果,以获得它们,如下所示:
var itemAndResult = listOfItems
.Select(x => new {Item = x, Result = GetResult(x)})
.Where(a => a.Result <= upperLimit)
.FirstOrDefault();
var item = itemAndResult.Item;
var result = itemAndResult.Result;