我试图看看是否可以制作一个评估为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}())
但不会编译
答案 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)