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

use*_*249 13 .net c# 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 .......}
Run Code Online (Sandbox Code Playgroud)

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

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

无法将lambda表达式转换为类型'bool',因为它不是委托类型.

Ser*_*kiy 34

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

if (cars.Any(c => c.door == null))
   // then ...
Run Code Online (Sandbox Code Playgroud)

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

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

if (anyCarDoesNotHaveDoor())
   // then ...
Run Code Online (Sandbox Code Playgroud)

我引入了局部变量来使事情更加清晰.但是你当然可以让这个难题变得更复杂

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

  • @ user3813249,你仍然需要调用委托.委托本身对"if"声明毫无意义. (4认同)
  • @ user3813249 Func <bool>委托应该返回布尔值,所以你不能只为它分配空体,就像你可以用`Action`做的那样. (2认同)

Bra*_*NET 9

好吧,错误说明了一切.一个if语句需要一个委托不是的布尔表达式.如果你打电话给代表(假设它返回了bool),你会没事的.但是,if不知道叫它.

使用AnyLINQ扩展方法的简单方法是:

if (cars.Any(car => car.door == null))
Run Code Online (Sandbox Code Playgroud)

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