2016-06-22 7 views
8

以下のクエリをより「読みやすく」する方法はありますか?3進演算子は読みにくい

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

条件と値の長いコードでは読みにくいです。

+0

適切なインデントを追加し、col –

+1

[tag:ternary-operator]: "3項演算子は、3つの引数を取る**任意の**演算子です。 "(tag:条件付き演算子)"を使用します。 –

+0

すべての条件を削除します*。あなたは 'OrderBy'と' ThenBy'ステートメントは関数であり、順序フィールドを動的に指定したい場合は、LINQ –

答えて

5

コードの可読性を向上させるには、いくつかの方法があります。あなたは可能性があり

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

場合、他の

インデント

一つの方法は、わずかに異なる方法でコードをインデントすることであるが、これは少しだけ読みやすさを支援しますこれらの三項演算子をifelseの読みやすい連鎖に変換します。

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 <>

1つのオプションは、IComparer<>の独自の実装を作成し、OrderByメソッドに渡すことであろう。私はあなたのオブジェクトがどのようなタイプであるか、どのタイプのキーがあなたのコードにあるのかわからないので、私はstringキーと仮定します。

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; 
     } 
    } 
} 

拡張メソッドは

は最後のオプションは、拡張メソッドにコードを移動するには、次のようになります。

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; 
     } 
    } 
} 

最後のオプションを使用して、OrderByへの通話は単純です:

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

これは私がやることです。複数の三項演算子は、すべての解析規則を知っていても理解するのが難しいだけです。 –

関連する問題