2013-06-06 158 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) 
{ 
} 

現在我們已經抽象什麼,否則可能會很複雜條件下成可讀的英語!