如何使代码块评估为bool

本文关键字:bool 评估 何使 代码 | 更新日期: 2023-09-27 18:17:37

我想看看是否有可能使一个代码块评估为bool(所以我可以做出很好的复合逻辑)。这个示例中的xxxx

if(a == 42 || <xxxxxxxxx> || p > 2)

我知道我可以把表达式放在那里,比如x>"foo"等。但是如果我需要像

这样的语句呢?
var foo = FiddleFoo(97);
foreach(var f in foo) {
   if (fudge(f) > 42)
      // true
}
// false

我知道这个例子可以重构为LINQ表达式,但这并不是普遍正确的(或者是-嗯?)

我知道我可以做一个单独的函数,但这似乎是错误的单一使用的东西。我尝试做一个lambda类型的东西(像javascript)

if .... (()=>{ stuff returning bool}())

但是不能编译

如何使代码块评估为bool

要将语句解析为布尔值,可以创建一个匿名方法,然后立即调用它。你已经做了这么多,试着用一个。不同之处在于,您需要为lambda添加一个委托上下文,以便编译器正确解释:

if(a == 42 || (new Func<bool>(() => 
    {
        var foo = FiddleFoo(97);
        foreach(var f in foo) 
        {
            if (fudge(f) > 42)
                return true;
        }
        return false;
    })() || p > 2)
{
    //...
}

我根本不建议这样做。您最好将它提取到一个命名方法中,即使您只使用它一次,但这确实是可能的。

你需要的是:

Predicate<FiddleFoo> fiddleFoo = x => {
    foreach(var f in x)
      if(fudge(f) > 42) return true;
    return false;
}

将你的代码变成:

if(a == 42 || fiddleFoo(new FiddleFoo(97)) || p > 2)