2013-05-02 7 views
5

ich eine Funktion haben, die wie folgtSimplifing eine verschachtelte IF-Anweisung

string Foo(bool A, bool B) 
{ 
    if(A) 
    { 
     if(B) 
     { 
      return "W"; 
     } 
     else 
     { 
      return "X"; 
     } 
    } 
    else 
    { 
     if(B) 
     { 
      return "Y"; 
     } 
     else 
     { 
      return "Z"; 
     } 
    } 
} 

Das doppelte Verschachtelung mir fühlt sich einfach falsch ist. Gibt es einen besseren Weg, dieses Muster zu implementieren?


Vielen Dank für die Hilfe, ich am Ende mit der Trinary Route. Es half dies wenden:

if (female) 
{ 
    if (nutered) 
    { 
     destRow["TargetSex"] = "FS"; 
    } 
    else 
    { 
     destRow["TargetSex"] = "F"; 
    } 
} 
else 
{ 
    if (nutered) 
    { 
     destRow["TargetSex"] = "MN"; 
    } 
    else 
    { 
     destRow["TargetSex"] = "M"; 
    } 
} 

um diese

destRow["TargetSex"] = female ? (nutered ? "FS" : "F") 
           : (nutered ? "MN" : "M"); 
+0

Es gibt immer 'if (A && B) {} sonst if (B) {} else {} ' –

+0

@DavidStarkey Es gibt 4 mögliche Ergebniszustände, Sie geben nur 3 zurück. –

+0

Dann' if (A && B) {} sonst if (! A && B) {} sonst if (B) {} else {} ' –

Antwort

10
if (A) 
{ 
    return B ? "W" : "X"; 
} 
return B ? "Y" : "Z"; 

Oder noch kurz und bündig:

return A ? (B ? "W" : "X") 
     : (B ? "Y" : "Z"); 

Wenn Ihr für ausschließlich nicht verschachtelten Bedingungen gehen:

if (A && B) return "W"; 
if (A && !B) return "X"; 
return B ? "Y" : "Z"; 
+2

Kann sogar 'A zurückgeben? (B? "W": "X"): (B? "Y": "Z")?. – SimpleVar

+0

@Yorye Das verliert ein bisschen Lesbarkeit für mich (persönlich) und könnte es übertreiben. – doppelgreener

+2

Die "noch knappe" Lösung ist diejenige, die ich am meisten mag. –

0

Sie vier mögliche Zustände. Eine kürzere (wenn auch nicht unbedingt einfacher zu pflegen) Darstellung würde

if (A && B) { 
    return "W"; 
} else if (A && !B) { 
    return "X"; 
} else if (!A && B) { 
    return "Y"; 
else return "Z"; 
3

Logisch, nicht sein. Sie haben 4 verschiedene Bedingungen für zwei Variablen.

Sie können den Code prägnante machen, aber:

string Foo(bool A, bool B) 
{ 
    return A ? 
     B ? "W" : "X" 
     : 
     B ? "Y" : "Z"; 

} 

Oder wenn Sie besonders bös Gefühl sind, legen es auf einer Zeile ohne parens !:

return A?B?"W":"X":B?"Y":"Z"; 
+0

Ich suchte nach einer besseren Prägnanz, ich wusste, dass es keine logische Vereinfachung gibt. –

+1

Diese beiden sind für die hässlichsten Optionen gebunden, die ich mir vorstellen kann! Trägst du auch gestreifte Krawatten mit deinen Plaidjacken? +1 für den Mut, diese beiden zu posten. –

+0

@PieterGeerkens um fair zu sein, war er der erste, der eine trianäre Lösung postte, Steaks postete ihn später als Schnitt. –

0

I muss nur zum Spaß reinwerfen:

string Foo(bool A, bool B) 
    { 
     var labels = new[]{"W", "X", "Y", "Z"}; 
     return labels[(A ? 0 : 2) + (B ? 0 : 1)]; 
    } 
+0

Clever, Als ich ursprünglich versuchte, über bessere Möglichkeiten nachzudenken, dachte ich eigentlich über eine ähnliche Idee nach, aber statt eines Arrays eine switch-Anweisung :). –

Verwandte Themen