我有一个DataSet
包含一列,称其为Type
其中包含ints。我使用LINQ来操作DataSet
,我想按Type
排序。 Type
列现在仅包含3个值(1,2,3)。我想排序,以便Type
2首先在列表中,然后是1和3.LINQ OrderBy有一个例外
是否有一个简单的解决方案,或者我将不得不自定义OrderBy?
我有一个DataSet
包含一列,称其为Type
其中包含ints。我使用LINQ来操作DataSet
,我想按Type
排序。 Type
列现在仅包含3个值(1,2,3)。我想排序,以便Type
2首先在列表中,然后是1和3.LINQ OrderBy有一个例外
是否有一个简单的解决方案,或者我将不得不自定义OrderBy?
几个解决方案:
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)。
这是真的吗,它可以改变,我们不知道。
+1 - 我会选择第二个选项。 – RedFilter
而不是pseeudocode我会添加实际代码:'table.AsEnumerable()。OrderByDescending(r => r.Field
@TimSchmelter爵士是的,先生;) –
为了让我删除,我们从数据表开始的事实,样品简单,它只是一个细节,我想我们可以做到这一点:
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)代表分拣机的结束。快乐可以以更好的方式处理,就像给你想法一样。此时该算法是通用的,不需要对首选值进行任何硬编码检查(只是快乐)。
存在一些潜在的低效率问题,但我只想说明这个解决方案的总体思路,以及更多的工作可以更有效地完成。
在这里你有5种方法来完成这一点。这是一篇关于如何设置价值作为第一个订单,然后扔在那些较低,并在高于所选的所以如果你有{1 2 3 4 5 6}
和选择项目,输出:{4 1 2 3 5 6}
..我更喜欢我自己的答案,但..^_^
的可能重复[LINQ的排序依据针对特定值(http://stackoverflow.com/questions/728319/linq-orderby-against-specific-values) – James