我试图使用linq表达式从List中进行选择,其中range变量在返回boolean的静态方法中求值。我想选择在使用方法计算范围变量时返回true的范围变量。
var result = from rangeVariable in DataSource
where (rangeVariable => Foo.MethodReturnsBoolean(rangeVariable) == true)
select rangeVariable;
我收到此错误:
无法将Lambda Expression转换为'bool'类型,因为它不是委托类型。
任何人都可以解释发生了什么,以及我如何实现这一目标?
答案 0 :(得分:18)
您不需要“where”子句中的lambda表达式 - 查询表达式转换会为您执行此操作。只需使用:
var result = from rangeVariable in DataSource
where Foo.MethodReturnsBoolean(rangeVariable) == true
select rangeVariable;
我个人会删除“== true”冗余(我知道这只是示例代码,但是......):
var result = from rangeVariable in DataSource
where Foo.MethodReturnsBoolean(rangeVariable)
select rangeVariable;
然后我会考虑使用查询表达式实际上是在为你买单。如果您只是做“where”(或只是做“选择”),您可能会发现点符号更简单:
var result = DataSource.Where(x => Foo.MethodReturnsBoolean(x));
它变得更好了:编译器不需要从lambda表达式推断返回值(因为它总是bool
)所以你可以只使用方法组转换:
var result = DataSource.Where(Foo.MethodReturnsBoolean);
那多清洁了多少? :)