2012-03-08 59 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