从lambda表达式内的函数调用中获取返回值

本文关键字:获取 返回值 函数调用 lambda 表达式 | 更新日期: 2023-09-27 17:53:02

考虑以下c#行:

var item = listOfItems.FirstOrDefault(i => GetResult(i) <= upperLimit);

我的问题是,是否有一种方法可以从该行内获得GetResult(i)的返回值?

显而易见的答案是有两行:

var item = listOfItems.FirstOrDefault(i => GetResult(i) <= upperLimit);
var result = GetResult(item);

但是调用同一个函数两次似乎有点低效…有一种方法可以用一次呼叫获得result吗?

从lambda表达式内的函数调用中获取返回值

您可以这样使用(假设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;