2016-06-22 3 views
8

Любое предложение, как сделать приведенный ниже запрос более «читаемым»?Тройной оператор трудно читать

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

Его трудно читать с длинным кодом состояния и значения.

+0

Добавить правильный отступ и выровнять col ons ':' с соответствующими метками квеста '?' –

+1

[tag: ternary-operator]: «Тернарный оператор является ** любым ** оператором, который принимает три аргумента. Для тернарного условного оператора '?' ... ':' используйте '[tag: условный-оператор]'. "(My * emphasis *) –

+0

Еще лучше * удалить все условия *. Вы добавляете' OrderBy' и ' ThenBy' в коде, это просто функции. Если вы хотите динамически указывать поле заказа, вы можете сделать это легко в LINQ –

ответ

5

Существует несколько способов улучшения читаемости вашего кода.

отступов

Одним из способов является отступа кода в несколько иначе, но это только помогает читаемость немного:

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

если еще

Вы могли также превращают эти троичные операторы в более читаемую цепочку if, else.

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

Одним из вариантов было бы написать свою собственную реализацию 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

Это то, что я бы тоже сделал. Множество тернарных операторов слишком сложно понять, даже если вы знаете все правила синтаксического анализа. –

Смежные вопросы