'if'语句条件中的Lambda表达式

时间:2014-07-07 16:49:41

标签: c# .net lambda

我是C#的新手,但根据我的理解,这段代码应该可行。为什么它不起作用?

这是我的代码示例。

List<Car> cars // This has many cars initialized in it already
if (() => {
   foreach(Car car in cars){
       if (car.door == null) return true;
   }
}){then .......}

简单地说,如果任何汽车没有门,我想要的代码就是运行if语句。

尝试编译后,我收到此错误:

  

无法将lambda表达式转换为&#39; bool&#39;因为它不是委托类型。

3 个答案:

答案 0 :(得分:33)

如果你想检查一辆车是否没有车门,那么只需使用Enumerable.Any - 它确定一个序列的任何元素是否满足条件:

if (cars.Any(c => c.door == null))
   // then ...

只是为了好玩:你应该执行lambda来获得布尔结果如果条件(但是对于这种情况使用Any)

Func<bool> anyCarDoesNotHaveDoor = () => { 
    foreach(var car in cars)
       if (car.door == null)
           return true;
    return false; 
};

if (anyCarDoesNotHaveDoor())
   // then ...

我介绍了局部变量以使事情更清晰。但当然你可以让这个难题更复杂

 if (new Func<bool>(() => { 
        foreach(var car in cars)
           if (car.door == null)
               return true;
        return false; })())
    // then ...    

答案 1 :(得分:9)

嗯,错误说明了一切。 if语句需要一个委托不是的布尔表达式。如果你打电话给代表(假设它返回bool),你会没事的。但是,if无法调用它。

执行此操作的简单方法是使用Any LINQ扩展方法:

if (cars.Any(car => car.door == null))

Any方法知道实际上在集合的每个成员上调用lambda表达式,并返回bool。这使它成为if语句的有效布尔表达式。

答案 2 :(得分:2)

如果你想在没有车门的情况下真正做某事:

foreach (var car in cars.Where(car => car.door == null)) {
    car.door = <whatever>;
}