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