2016-06-22 24 views
8

Bất kỳ đề xuất nào làm cho truy vấn bên dưới trở nên "dễ đọc" hơn?Toán tử Ternary khó đọc

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

Khó đọc với mã điều kiện và giá trị dài.

+0

Thêm thụt lề thích hợp và căn chỉnh col ':' với dấu questino tương ứng '? ' –

+1

[tag: toán tử ternary]:" Toán tử bậc ba là ** toán tử ** bất kỳ có ba đối số. Đối với toán tử điều kiện bậc ba '?' ... ':', sử dụng '[tag: điều kiện điều hành]'. "(Nhấn mạnh * của tôi *) –

+0

Tốt hơn * loại bỏ tất cả các điều kiện *. Bạn thêm' OrderBy' và ' Sau đóBy' báo cáo trong mã, họ chỉ là chức năng.Nếu bạn muốn xác định lĩnh vực đặt hàng tự động, bạn có thể làm như vậy một cách dễ dàng trong LINQ –

Trả lời

5

Có một số cách để cải thiện khả năng đọc mã của bạn.

Indentation

Một cách là thụt mã theo một cách hơi khác nhau, nhưng điều này chỉ giúp dễ đọc một chút:

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

nếu, khác

Bạn có thể cũng biến các toán tử bậc ba thành một chuỗi dễ đọc hơn là 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 <>

Một lựa chọn sẽ được để viết thực hiện của riêng bạn IComparer<> và vượt qua nó với phương pháp OrderBy. Tôi không biết loại đối tượng của bạn là gì hoặc loại khóa nào nằm trong mã của bạn, vì vậy tôi sẽ giả sử các khóa 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; 
     } 
    } 
} 

phương pháp mở rộng

Một lựa chọn cuối cùng sẽ là di chuyển mã của bạn để một phương pháp khuyến nông:

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

Sử dụng tùy chọn cuối cùng, cuộc gọi của bạn để OrderBy chỉ đơn giản là:

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

Đó cũng là những gì tôi sẽ làm. Nhiều toán tử bậc ba chỉ là quá khó hiểu ngay cả khi bạn biết tất cả các quy tắc phân tích cú pháp. –

Các vấn đề liên quan