我有一个DataSet
包含一列的列,称它为Type
包含整数。我正在使用 LINQ 来操作DataSet
并且我想按Type
. 该Type
列现在仅包含 3 个值(1、2、3)。我想排序,以便Type
2 在列表中排在第一位,然后是 1 和 3。
是否有一个简单的解决方案,或者我将不得不自定义 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"))
或者优雅的 Tim Schmelter 的解决方案
table.AsEnumerable()
.OrderByDescending(r => r.Field<int>("Type")==2)
.ThenBy(r => r.Field<int>("Type"))
优势或 Tim Schmelter 的解决方案:您不依赖于“伪值”。
在前两个解决方案中,我们断言 0 是((字段的最小可能值)-1)。
这是真的吗,能不能改变,我们不知道。
为了使示例更简单,我删除了我们从 DataTable 开始的事实,这只是一个细节,我认为我们可以这样做:
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;
排序数组包含首选的排序器,这样我们可以在需要时拥有多个排序器,然后有一个 'jolly' (-1) 表示排序器的结束。欢乐可以以更好的方式处理,就像这样只是为了给你一个想法。在这一点上,算法是通用的,不需要对首选值进行任何硬编码检查(只是快乐)。
有一些潜在的低效率,但我只是想展示这个解决方案的总体思路,通过更多的工作可以更有效地完成。
在这里,您有 5 种方法可以做到这一点。这是一篇关于如何将值设置为第一个订单的帖子,然后将值设置为较低的值,然后放入高于所选值的值,因此如果您有{1 2 3 4 5 6}
并选择第 4项,则输出:{4 1 2 3 5 6}
.. 我更喜欢我自己的答案。 . ^_^