C# 减少(我的)Linq列表排序的冗长性

C# 减少(我的)Linq列表排序的冗长性,c#,linq,sorting,C#,Linq,Sorting,我有一个要排序的类型化数据表,类似于: DataTable.DefaultView.Sort("sortexpression"); 因为排序表达式是一个字符串,所以无论有多少排序选项,我都可以将排序字段和方向附加在几行中。现在,对于Linq,我显然做了一些非常错误的事情,因为要做类似的事情,我会这样做: this.GetSortExpressions(); if ((ViewState["SortDirection"] as string) == "A

我有一个要排序的类型化数据表,类似于:

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语句。正确的方法是什么?

在执行排序(未测试)之前,为orderby方法指定一个
Func

public IOrderedEnumerable OrderFunc(
这是一个数不清的来源,
Func键选择器
);
OrderFunc顺序;
如果((ViewState[“SortDirection”]作为字符串)==“ASC”)
order=可枚举的OrderBy;
其他的
order=Enumerable.OrderByDescending;
开关(ViewState[“SortField”]作为字符串)
{
“LKey”案:
this.SortedDetails=订单(this.Details,d=>d.LKey);
打破
案例“MName”:
this.SortedDetails=订单(this.Details,d=>d.MaterialName);
打破
案例“FMSQOH”:
this.SortedDetails=订单(this.Details,d=>d.FMSQOH);
打破
案例“CCQOH”:
this.SortedDetails=订单(this.Details,d=>d.CCQOH);
打破
案例“FMSQOHVary”:
this.SortedDetails=订单(this.Details,d=>d.FMSQOHVary);
打破
违约:
this.SortedDetails=订单(this.Details,d=>dLKey);
打破
}

我已经经历了这一切。。我最后发现的是一个通用解决方案,它使用反射对IEnumerable对象进行排序

这将是你可以使用它的方式

Sorter<TestClass> sort = new Sorter<TestClass>(this.Deatils, "LKey ASC");
List<TestClass> sorted = sort.GetSortedList();
Sorter sort=新分拣机(this.Deatils,“LKey ASC”);
List sorted=sort.GetSortedList();

关于。

为什么要将
OrderByDescending
的结果强制转换为
IOrderedEnumerable
?它已经返回了。嗨,我刚把它清理干净。这是前一次混乱的遗留问题。您是否可以控制
ViewState[“SortField”]
及其类型?如果是这样的话,你能把它变成别的东西吗?LINQ的全部目的是让类型安全字符串从您的身上消除这一点。htis one:Thx看起来是一个颠覆排序方向的好开端。还有什么方法可以压缩排序字段的确定?如果您可以将
ViewState[“SortField”]
的所有值都设置为属性的名称,那么可能可以通过反射来实现。如果不是这样的话,它会稍微困难一些,但是使用常量数组来执行映射应该是可行的。。。。然后我想我一定是疯了。要是我知道T先生会怎么做就好了;现在这很性感。我只需要克服使用反射对列表进行排序的问题。似乎很奇怪;)对反射是实现像数据表一样的排序舒适性的唯一方法。
Sorter<TestClass> sort = new Sorter<TestClass>(this.Deatils, "LKey ASC");
List<TestClass> sorted = sort.GetSortedList();