2013-06-06 110 views
2

有没有办法快速检查以下逻辑?我正在使用C#。使用else与多个if语句C#

if(a) 
{ 
} 
if(b) 
{ 
} 
if(c) 
{ 
} 
else none of the above //...? execute if all above conditions are false 
{ 
} 

这与使用if-else的不同之处在于,a,b和c都可以同时为真。所以我不能以这种方式堆叠它们。我想检查其他的a,b和c都是假的而不写if(!a && !b && !c)。这是因为如果条件变得更复杂,代码会变得非常混乱。它需要重写很多代码。这可能吗?

回答

4

那么它不是很“干净”,但我会做

bool noneAreTrue = true; 
if(a) 
{ 
    noneAreTrue = false; 
} 
if(b) 
{ 
    noneAreTrue = false; 
} 
if(c) 
{ 
    noneAreTrue = false; 
} 
if(noneAreTrue) 
{ 
    //execute if all above conditions are false 
} 

另外,如果你的条件真的是相当大的,我从书上清洁代码由Robert推荐规则G28(包封物条件语句) C.马丁

这是相当冗长,但在某些情况下更容易阅读:

public void YourMethod() 
{ 
    if(SomeComplexLogic()) 
    { 
    } 
    if(SomeMoreLogic()) 
    { 
    } 
    if(EvenMoreComplexLogic()) 
    { 
    } 
    if(NoComplexLogicApply()) 
    { 
    } 
} 

private bool SomeComplexLogic(){ 
    return stuff; 
} 

private bool EvenMoreComplexLogic(){ 
    return moreStuff; 
} 

private bool EvenMoreComplexLogic(){ 
    return evenMoreStuff; 
} 

private bool NoComplexLogicApply(){ 
    return SomeComplexLogic() && EvenMoreComplexLogic() && EvenMoreComplexLogic(); 
} 
1

如何结合合作策略ncepts和规范

var strategies = _availableStrategies.All(x => x.IsSatisfiedBy(value)); 
foreach (var strategy in strategies) 
{ 
    strategy.Execute(context); 
} 
if (!strategies.Any()) { 
    // run a different strategy 
} 
+0

对于复杂的情况可以,但可能不会只有3例。 – Guillaume

+0

引用问题“这是因为如果条件变得更复杂,代码可能会变得非常混乱,它需要重写很多代码。”其他解决方案只是丑陋的,并没有帮助可维护性。你也可以使用Func和/或Actions而不是我给的解决方案,这可能会简化实现。 – Alistair

+0

是的,我喜欢你的解决方案,我认为它是最干净的,这就是为什么我选择了它。但要使用它,你确实需要确保有一个复杂的场景,因为在简单的情况下,所有背后的工作可能都不值得。也许你可以在你的回答中显示IStrategy的实现。 – Guillaume

0

而不是封装在一个方法一些复杂的情况,你将只调用过一次或两次,我只想保持一个变量。这比使用其他答案建议的布尔标记更具可读性。

一个人为的例子,

bool isBlue = sky.Color == Colors.Blue; 
bool containsOxygen = sky.Atoms.Contains("oxygen") && sky.Bonds.Type == Bond.Double; 
bool canRain = sky.Abilities.Contains("rain"); 
if(isBlue) 
{ 
} 
if(containsOxygen) 
{ 
} 
if(canRain) 
{ 
} 
if(!isBlue && !containsOxygen && !canRain) 
{ 
} 

现在我们已经抽象什么,否则可能会很复杂条件下成可读的英语!