2012-09-26 48 views
1

我有一个DataSet包含一列,称其为Type其中包含ints。我使用LINQ来操作DataSet,我想按Type排序。 Type列现在仅包含3个值(1,2,3)。我想排序,以便Type 2首先在列表中,然后是1和3.LINQ OrderBy有一个例外

是否有一个简单的解决方案,或者我将不得不自定义OrderBy?

+0

的可能重复[LINQ的排序依据针对特定值(http://stackoverflow.com/questions/728319/linq-orderby-against-specific-values) – James

回答

5

几个解决方案:

table.AsEnumerable() 
.OrderBy(r => r.Field<int>("Type")==2 ? 0 : 1) 
.ThenBy(r => r.Field<int>("Type")); 

或可能更好

table.AsEnumerable(). 
OrderBy(r => r.Field<int>("Type")==2 
    ? 0 
    : r => r.Field<int>("Type")) 

或也优雅添Schmelter的解决方案

table.AsEnumerable() 
.OrderByDescending(r => r.Field<int>("Type")==2) 
.ThenBy(r => r.Field<int>("Type")) 

优势或添Schmelter的解决方案:你不是取决于“伪价值”。

在两个第一个解决方案中,我们声明0是((该字段的最小可能值)-1)。

这是真的吗,它可以改变,我们不知道。

+0

+1 - 我会选择第二个选项。 – RedFilter

+1

而不是pseeudocode我会添加实际代码:'table.AsEnumerable()。OrderByDescending(r => r.Field (“Type”)== 2)。ThenBy(r => r.Field (“Type”)) )' –

+0

@TimSchmelter爵士是的,先生;) –

0

为了让我删除,我们从数据表开始的事实,样品简单,它只是一个细节,我想我们可以做到这一点:

var list = new [] { 1, 3, 5, 2, 4, 6, 9, 8 }; 
var sorters = new [] { 3, 2, -1 }; 

var o = from s in sorters 
     from l in list.OrderBy(x => x) 
     where s == l || (s == -1 && !sorters.Contains(l)) 
     select l; 

排序数组包含首选分拣机,这种方式如果我们需要它们,我们可以有多个,然后有一个'快乐'(-1)代表分拣机的结束。快乐可以以更好的方式处理,就像给你想法一样。此时该算法是通用的,不需要对首选值进行任何硬编码检查(只是快乐)。

存在一些潜在的低效率问题,但我只想说明这个解决方案的总体思路,以及更多的工作可以更有效地完成。

0

在这里你有5种方法来完成这一点。这是一篇关于如何设置价值作为第一个订单,然后扔在那些较低,并在高于所选的所以如果你有{1 2 3 4 5 6}和选择项目,输出:{4 1 2 3 5 6} ..我更喜欢我自己的答案,但..^_^

https://stackoverflow.com/a/12580121/920359