如何使代码块评估为bool

时间:2015-10-14 15:41:48

标签: c#

我试图看看是否可以制作一个评估为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}())

但不会编译

2 个答案:

答案 0 :(得分:4)

要将语句解析为布尔值,可以创建匿名方法,然后立即调用它。你到目前为止,试图使用lambda。不同之处在于您需要为编译器正确解释的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)
{
    //...
}

我不建议这样做。即使你只使用一次,你也可以 更好地将其提取到一个命名方法中,但确实有可能。

答案 1 :(得分:0)

您需要的是:

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)