2015-06-20 18 views
5

Trong mã C# của tôi, tôi cần đánh giá hai biến không null. Tôi đã làm việc ra một tập hợp các câu lệnh if-else nếu, nhưng trong đầu tôi có vẻ xấu xí và hơi quá cẩu thả, ngay cả khi nó đúng.Có cách nào hiệu quả để thực hiện câu lệnh chọn với hai biến không?

Tôi đã xem trong số MSDN Library và chỉ xem các ví dụ để lựa chọn dựa trên một biến duy nhất.

Có cách nào gọn gàng hơn và gọn gàng hơn để đạt được kết quả tương tự không?

Cập nhật: Tôi điền mã để cung cấp thêm ngữ cảnh. Nhìn vào điều này nhiều hơn, có lẽ tôi có thể thao tác truy vấn LINQ trực tiếp dựa trên các tham số. Tuy nhiên, câu hỏi tôi đặt ra là loại chung mà tôi muốn tập trung vào: lựa chọn thay vì mã được sử dụng sau khi lựa chọn được thực hiện.

public ActionResult Index(string searchBy, string orderBy, string orderDir) 
{ 
    var query = fca.GetResultsByFilter(searchBy); 

    if (orderBy == "Campus" && orderDir == "Asc") 
    { 
     query = query = query.OrderBy(s => s.Campus).ThenBy(s => s.Student_Name); 
    } 
    else if (orderBy == "Campus" && orderDir == "Desc") 
    { 
    query = query.OrderByDescending(s => s.Campus); 
    } 
    else if (orderBy == "Student Name" && orderDir == "Asc") 
    { 
     query = query = query.OrderBy(s => s.Student_Name); 
    } 
    else if (orderBy == "Student Name" && orderDir == "Desc") 
    { 
     query = query.OrderByDescending(s => s.Student_Name); 
    } 
    else if (orderBy == "Course Count" && orderDir == "Asc") 
    { 
    query = query.OrderBy(s => s.Course_Count); 
    } 
    else if (orderBy == "Course Count" && orderDir == "Desc") 
    { 
    query = query.OrderByDescending(s => s.Course_Count); 
    } 
} 
+1

Mã '/ * ... ... * /' là gì? Bạn có thể sử dụng LINQ để thực hiện các truy vấn như thế này, giả định rằng đó là những gì bên trong mã. – Cyral

+0

Tôi đã nói theo nghĩa chung hơn. Đây là các tham số gửi vào hàm bằng cách gửi biểu mẫu. Tôi sẽ sửa đổi câu hỏi đã đăng của mình để cung cấp ngữ cảnh đó. –

+0

Đầu tiên bạn có thể tạo một phương thức như If (check ("campus", "ASC")) ..., sau đó thêm chuỗi của bạn vào một mảng và lặp qua ... cho (i ...) {if (check (strby [i], strdir [i]))} .... hoặc tạo một đối tượng đặc biệt cho nó nếu bạn không thích hai mảng ... – ElDuderino

Trả lời

4

Bạn có thể tạo ra một phương pháp mở rộng trên IQueryable xử lý đặt hàng với một trong hai OrderBy hoặc OrderByDescending:

public static class QueryableExtensions 
{ 
    public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey> 
     (this IQueryable<TSource> source, 
     Expression<Func<TSource, TKey>> keySelector, 
     string orderDir) 
    { 
     return orderDir == "Desc" 
         ? source.OrderByDescending(keySelector) 
         : source.OrderBy(keySelector); 
    } 
} 

Tôi giả định rằng phương pháp GetResultsByFilter của bạn được trả lại một IQueryable<>. Nếu nó thực sự trả về một IEnumerable<>, thì phương pháp mở rộng sẽ cần phải tham số IEnumerable<TSource> source và trả lại một IOrderedEnumerable<TSource> thay thế.

này sau đó có thể được sử dụng như sau:

public ActionResult Index(string searchBy, string orderBy, string orderDir) 
{ 
    var query = fca.GetResultsByFilter(searchBy); 

    switch (orderBy) 
    { 
     case "Campus": 
      query = query.OrderByWithDirection(s => s.Campus, orderDir); 
      break; 
     case "Student Name": 
      query = query.OrderByWithDirection(s => s.Student_Name, orderDir); 
      break; 
     case "Course Count": 
      query = query.OrderByWithDirection(s => s.Course_Count, orderDir); 
      break; 
    } 

    if (orderBy == "Campus" && orderDir == "Asc") 
    { 
     // The Campus Asc case was also ordered by Student_Name in the question. 
     query = query.ThenBy(s => s.Student_Name); 
    } 
} 
+0

Câu hỏi hay GetResultsByFilter (chuỗi) gọi 'IEnumerable GetResultsByFilter (bộ lọc chuỗi)'. Bạn có khuyên bạn nên đặt điều này trong mô hình hoặc trong bộ điều khiển? –

+0

@Rubix_Revenge Giả sử rằng đây là một truy vấn cơ sở dữ liệu, sẽ tốt hơn nếu thực hiện 'GetResultsByFilter' return' IQueryable '. Điều này sẽ cho phép 'OrderBy' được thực hiện ở cấp cơ sở dữ liệu như là một SQL' ORDER BY' (xem http://stackoverflow.com/q/2876616). Tôi có thể đặt phương thức 'GetResultsByFilter' trong bộ điều khiển trừ khi nó được sử dụng trong nhiều bộ điều khiển. –

+0

Tôi đã tạo IEnumerable để làm việc này với nhu cầu lớn hơn của Chế độ xem MVC. Bạn nâng cao một điểm tốt, nhưng bây giờ tôi đang bước vào thế giới của cái cút-một-nốt ruồi, nơi làm cho một sự thay đổi gây ra vấn đề ở những nơi khác. –

1

Tôi sẽ sử dụng toán tử bậc ba để làm gọn hơn và dễ đọc hơn như thế này.

Điều này cũng sẽ cắt bỏ một số kiểm tra boolean vì nó không trùng lặp bất kỳ trong số chúng.

public ActionResult Index(string searchBy, string orderBy, string orderDir) 
    { 
     var query = fca.GetResultsByFilter(searchBy); 

     if (orderBy == "Campus") 
     { 
      query = (orderDir == "Asc") ? query.OrderBy(s => s.Campus).ThenBy(s => s.Student_Name) : 
       query.OrderByDescending(s => s.Campus); 
     } 
     else if (orderBy == "Student Name") 
     { 
      query = (orderDir == "Asc") ? query.OrderBy(s => s.Student_Name) : query.OrderByDescending(s => s.Student_Name); 
     } 
     else if (orderBy == "Course Count") 
     { 
      query = (orderDir == "Asc") ? query.OrderBy(s => s.Student_Name) : query.OrderByDescending(s => s.Course_Count); 
     } 
    } 
+0

Tôi không nghĩ đến một toán tử bậc ba, nhưng tôi thích nó . Thật dễ dàng để đọc và tạo, và tôi có thể dễ dàng xem nó hoạt động như thế nào bây giờ mà tôi thấy nó. –

+0

Rất vui được giúp đỡ. Chúng rất hữu ích. – deathismyfriend

2

CNot chắc chắn nếu điều này tốt hơn, chỉ khác nhau.

switch (orderDir) 
{ 
    case "Asc": 
     Switch (orderBy) 
     { 
      case "Campus": 
       //Code here for Campus orderBy and Asc orderDir 
       break; 
      case "Student Name": 
       //Code here for Student Name orderBy and Asc orderDir 
       break; 
      case "Course Count": 
       //Code here for Course Count orderBy and Asc orderDir 
       break; 
     } 
     break; 
    case "Desc": 
     Switch (orderBy) 
     { 
      case "Campus": 
       //Code here for Campus orderBy and Desc orderDir 
       break; 
      case "Student Name": 
       //Code here for Student Name orderBy and Desc orderDir 
       break; 
      case "Course Count": 
       //Code here for Course Count orderBy and Desc orderDir 
       break; 
     } 
     break; 
} 
0

mất của tôi:

public interface IOrder { 
    void perform(Query query) 
} 

public abstract class AbstractOrder : IOrder { 

    protected string orderString; 

    public AbstractOrder(string orderString) { 
     this.orderString = orderString; 
    } 
} 

public class OrderAsc { 

    public OrderAsc(string orderString) : base(orderString) { 
    } 

    public Query perform(Query query) { 
     query = query.OrderBy(s => s.Course_Count); //here you still have to do a mapping between orderString and your db field s.Course_count 
     return query; 
    } 
} 

public class OrderDesc { 

    public OrderDesc(string orderString) : base(orderString) { 
    } 

    public Query perform(Query query) { 
     query = query.OrderByDescending(s => s.Course_Count); //here you still have to do a mapping between orderString and your db field s.Course_count, or maybe it's equal, then you can just replace it. 
     return query; 
    } 
} 

sau đó ...

IList<IOrder> list = new List<IOrder>() {new OrderAsc("Campus"), new OrderDesc("Student Name")} 

foreach(IOrder o in list) { 
    query = o.perform(query); 
} 

Có thể có một số sai lầm trong nó, tôi don không có một IDE trong tầm tay.

+0

Khi tôi vẫn đang trên đường cong học tập ngôn ngữ, điều này chắc chắn là mới đối với tôi. Nhưng điều này mang lại cho tôi một số vật liệu để nhai. Cảm ơn –

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