2016-06-22 21 views
8

Irgendwelche Vorschläge, wie die unten stehende Abfrage "lesbarer" gemacht werden könnte?Ternärer Operator schwer zu lesen

var result = result 
       .OrderBy(a => 
        (conditionA) ? 
        valueA : 
        (conditionB ? valueB : 
        (conditionC ? 
        (conditionD ? 
        valueC : valueD) : 
        valueE))); 

Es ist schwer zu lesen mit dem langen Code von Zustand und Wert.

+0

Fügen Sie den richtigen Einzug hinzu und richten Sie die Spalte aus Ons ':' mit ihren entsprechenden questio Marken '? –

+1

[tag: ternary-operator]:" Ein ternärer Operator ist ** any ** Operator, der drei Argumente akzeptiert. Für den ternären Bedingungsoperator '?' ... ':' verwenden Sie '[tag: konditionaloperator]'. "(Mein * emphasis *) –

+0

Besser noch * entfernen Sie alle Bedingungen *. Sie fügen' OrderBy' und ' ThenBy' Anweisungen im Code, sie sind nur Funktionen.Wenn Sie das Bestellfeld dynamisch angeben möchten, können Sie dies problemlos in LINQ –

Antwort

5

Es gibt verschiedene Möglichkeiten, die Lesbarkeit Ihres Codes zu verbessern.

Einrückungen

Eine Möglichkeit ist, den Code auf eine etwas andere Art und Weise einrücken, aber das hilft nur Lesbarkeit ein wenig:

var result = result.OrderBy(a => 
    conditionA ? valueA : 
    conditionB ? valueB : 
    conditionC ? conditionD ? valueC : 
           valueD : 
       valueE); 

wenn, sonst

konnte Sie Auch diese ternären Operatoren werden in eine besser lesbare Kette von if, else umgewandelt.

var result = Result.OrderBy(a => { 
    if (conditionA) 
    { 
     return valueA; 
    } 
    else if (conditionB) 
    { 
     return valueB; 
    } 
    else if (conditionC) 
    { 
     if (conditionD) 
     { 
      return valueC; 
     } 
     else 
     { 
      return valueD; 
     } 
    } 
    else 
    { 
     return valueE; 
    } 
}); 

IComparer <>

Eine Möglichkeit wäre, eine eigene Implementierung von IComparer<> zu schreiben und an die OrderBy-Methode übergeben. Ich weiß nicht, welchen Typ Ihr ​​Objekt hat oder welchen Typ die Schlüssel in Ihrem Code haben, also gehe ich von string Schlüsseln aus.

public class MyClassComparer : IComparer<MyClass> 
{ 
    public int Compare(MyClass x, MyClass y) 
    { 
     string xKey = getKey(x); 
     string yKey = getKey(y); 
     return string.Compare(xKey, yKey); 
    } 

    private string getKey(MyClass item) 
    { 
     if (item.conditionA) 
     { 
      return item.valueA; 
     } 
     else if (item.conditionB) 
     { 
      return item.valueB; 
     } 
     else if (item.conditionC) 
     { 
      if (item.conditionD) 
      { 
       return item.valueC; 
      } 
      else 
      { 
       return item.valueD; 
      } 
     } 
     else 
     { 
      return item.valueE; 
     } 
    } 
} 

Erweiterungsmethode

Eine letzte Option wäre, um Ihren Code zu einer Verlängerung Methode zu bewegen:

public static class MyClassExtensions 
{ 
    public static string GetSortingKey(this MyClass item) 
    { 
     if (item.conditionA) 
     { 
      return item.valueA; 
     } 
     else if (item.conditionB) 
     { 
      return item.valueB; 
     } 
     else if (item.conditionC) 
     { 
      if (item.conditionD) 
      { 
       return item.valueC; 
      } 
      else 
      { 
       return item.valueD; 
      } 
     } 
     else 
     { 
      return item.valueE; 
     } 
    } 
} 

die letzte Option verwenden, ist Ihr Anruf OrderBy einfach:

result.OrderBy(a => a.GetSortingKey()) 
+2

Das würde ich auch tun.Mehrere ternäre Operatoren sind einfach zu schwer zu verstehen, selbst wenn Sie alle Parserregeln kennen. –

Verwandte Themen