Linq将方法评估为lambda表达式

the*_*rrs 3 c# linq lambda

我试图使用linq表达式从List中进行选择,其中range变量在返回boolean的静态方法中求值.我想选择在使用该方法计算范围变量时返回true的范围变量.

var result = from rangeVariable in DataSource
             where (rangeVariable => Foo.MethodReturnsBoolean(rangeVariable) == true)
             select rangeVariable;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

无法将Lambda Expression转换为'bool'类型,因为它不是委托类型.

任何人都可以解释发生了什么,以及我如何实现这一目标?

Jon*_*eet 18

您不需要"where"子句中的lambda表达式 - 查询表达式转换为您执行此操作.只需使用:

var result = from rangeVariable in DataSource
             where Foo.MethodReturnsBoolean(rangeVariable) == true
             select rangeVariable;
Run Code Online (Sandbox Code Playgroud)

我个人然后删除"== true"冗余(我知道这只是示例代码,但是......):

var result = from rangeVariable in DataSource
             where Foo.MethodReturnsBoolean(rangeVariable)
             select rangeVariable;
Run Code Online (Sandbox Code Playgroud)

然后我会考虑使用查询表达式实际上是在为你买单.如果你只是做"在哪里"(或只是做"选择")你可能会发现点符号更简单:

var result = DataSource.Where(x => Foo.MethodReturnsBoolean(x));
Run Code Online (Sandbox Code Playgroud)

它变得更好:编译器不需要从lambda表达式推断返回值(因为它总是如此bool)所以你可以使用方法组转换:

var result = DataSource.Where(Foo.MethodReturnsBoolean);
Run Code Online (Sandbox Code Playgroud)

这有多清洁?:)