Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# λ表达式在';如果';语句条件_C#_.net_Lambda - Fatal编程技术网

C# λ表达式在';如果';语句条件

C# λ表达式在';如果';语句条件,c#,.net,lambda,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 .......} List cars//这已经有很多车在里面初始化了 如果(()

我是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 .......}
List cars//这已经有很多车在里面初始化了
如果(()=>{
foreach(汽车中的汽车){
如果(car.door==null)返回true;
}
}){那么……}
简单地说,如果任何一辆车没有门,我想要代码做的就是运行
if
语句

尝试编译后,我出现以下错误:

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


如果您想检查是否有任何汽车没有车门,则只需使用-它确定序列中的任何元素是否满足条件:

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

只是为了好玩:您应该在if条件下执行lambda以获得布尔结果(但在这种情况下使用Any)

Func anyCarDoesNotHaveDoor=()=>{
foreach(车辆中的var车辆)
if(car.door==null)
返回true;
返回false;
};
if(anyCarDoesNotHaveDoor())
//然后。。。
我引入了局部变量以使事情更清楚。当然,你可以把这个难题弄得更复杂

 if (new Func<bool>(() => { 
        foreach(var car in cars)
           if (car.door == null)
               return true;
        return false; })())
    // then ...    
if(新函数(()=>{
foreach(车辆中的var车辆)
if(car.door==null)
返回true;
返回false;})()
//然后。。。

好吧,这个错误说明了一切。
if
语句所需的布尔表达式不是委托。如果您要调用代理(假设它返回一个
bool
),您就可以了。但是,
if
不知道如何调用它

实现这一点的简单方法是使用
Any
LINQ扩展方法:

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

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

如果您想对没有车门的汽车执行某些操作:

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

您甚至没有使用正确的lambda语法。它将是
()=>{
..,而不是
()={
..当然,如果您正在使用它,它将不起作用,但这是另一个故事。只是为了确保您可以这样做。如果(Func()=>{})@user3813249,您仍然必须调用该委托。委托本身对
if
语句毫无意义。@user3813249 Func委托应返回布尔值,因此您不能像处理
操作那样只为其分配空的正文。这似乎是一个误导性的解释。委托是一个表达式,由过了一会儿,我们把它称为lambda表达式;只是,
if
要求它的条件是一个布尔表达式-一个类型为
bool
。lambda对于某些返回类型
T
Func
,因此不能满足该要求。(它们也可以是表达式树类型,具体取决于使用上下文的推断,但它们不能是
bool
)@00Davo您是对的,这本可以用更好的措辞。我将进行编辑,看看是否可以清除它。
foreach (var car in cars.Where(car => car.door == null)) {
    car.door = <whatever>;
}