2012-03-08 57 views
0

冗長我有一個類型DataTable進行排序只是類似:減少的(我)的LINQ列表排序

DataTable.DefaultView.Sort("sortexpression"); 

因爲排序表達式是一個字符串,我可以只添加這兩種排序字段和方向幾行,不管我有多少種排序選項。現在使用LINQ林清楚地做一些非常錯誤的,因爲做同樣的事情,我這樣做:

   this.GetSortExpressions(); 
     if ((ViewState["SortDirection"] as string) == "ASC") 
     { 
      switch (ViewState["SortField"] as string) 
      { 
       case "LKey": 
        this.SortedDetails = this.Details.OrderBy(d => d.LKey); 
        break; 
       case "MName": 
        this.SortedDetails = this.Details.OrderBy(d => d.MaterialName); 
        break; 
       case "FMSQOH": 
        this.SortedDetails = this.Details.OrderBy(d => d.FMSQOH); 
        break; 
       case "CCQOH": 
        this.SortedDetails = this.Details.OrderBy(d => d.CCQOH); 
        break; 
       case "FMSQOHVary": 
        this.SortedDetails = this.Details.OrderBy(d => d.FMSQOHVary); 
        break; 
       default: 
        this.SortedDetails = this.Details.OrderBy(d => d.LKey); 
        break; 
      } 
     } 
     else 
     { 
      switch (ViewState["SortField"] as string) 
      { 
       case "LKey": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.LKey); 
        break; 
       case "MName": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.MaterialName); 
        break; 
       case "FMSQOH": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOH); 
        break; 
       case "CCQOH": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.CCQOH); 
        break; 
       case "FMSQOHVary": 
        this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOHVary); 
        break; 
       default: 
        this.SortedDetails = this.Details.OrderByDescending(d => d.LKey); 
        break; 
      } 
     } 

這是上帝可怕。我很擔心我爲每個新的排序字段添加2 * n個case語句。什麼是正確的方式?執行排序(未經測試)之前

+0

爲什麼將'OrderByDescending'的結果轉換爲'IOrderedEnumerable'?它已經返回。 – 2012-03-08 04:54:09

+0

嗨,我剛剛清理過。這是從以前的混亂中解酒。 – rism 2012-03-08 04:59:03

+0

你有控制''ViewState [「SortField」]''它是類型嗎?如果是這樣,你可以把它變成別的東西然後''字符串'? LINQ的全部重點是保證類型安全 - 字符串將它從您身邊帶走。 – 2012-03-08 08:15:48

回答

1

我已經通過這個走了..我發現最後是使用反射來排序的IEnumerable對象的通用解決方案。

http://zhousanfeng.wordpress.com/2009/12/01/a-generic-comparersorter-class%E8%BD%AC/

這將是你如何使用它

Sorter<TestClass> sort = new Sorter<TestClass>(this.Deatils, "LKey ASC"); 
List<TestClass> sorted = sort.GetSortedList(); 

問候。

+0

現在,那就是性感。我只需要使用Reflection來排序列表。似乎很奇怪;) – rism 2012-03-08 05:16:41

+0

是的。反射是實現像數據表一樣排序的舒適方法。 – 2012-03-08 05:43:30

0

分配Func的排序依據方法:

public IOrderedEnumerable<TSource> OrderFunc<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector 
); 
OrderFunc order; 
if ((ViewState["SortDirection"] as string) == "ASC") 
    order = Enumerable.OrderBy; 
else 
    order = Enumerable.OrderByDescending; 

switch (ViewState["SortField"] as string) 
{ 
    case "LKey": 
     this.SortedDetails = order(this.Details, d => d.LKey); 
    break; 
    case "MName": 
     this.SortedDetails = order(this.Details, d => d.MaterialName); 
    break; 
    case "FMSQOH": 
     this.SortedDetails = order(this.Details, d => d.FMSQOH); 
    break; 
    case "CCQOH": 
     this.SortedDetails = order(this.Details, d => d.CCQOH); 
    break; 
    case "FMSQOHVary": 
     this.SortedDetails = order(this.Details, d => d.FMSQOHVary); 
    break; 
    default: 
     this.SortedDetails = order(this.Details, d => dLKey); 
    break; 
} 
+0

Thx,看起來像一個偉大的開始敲敲排序的方向。任何方式來壓縮排序字段的確定? – rism 2012-03-08 05:06:14

+0

如果你可以使'ViewState [「SortField」]'的所有值的屬性的名稱,然後可能可以做到與反射。如果不是那麼它會稍微困難一點,但它應該可以通過一個常量數組來執行映射。 – 2012-03-08 05:08:54

+0

我想過反思......然後我想我一定是瘋了。如果我知道T先生會這麼做的話。 ; 0 – rism 2012-03-08 05:17:47