我有一个包含列的DataSet
,称之为Type
,其中包含整数。我正在使用LINQ来操纵DataSet
,我希望按Type
排序。 Type
列目前仅包含3个值(1,2,3)。我想排序,以便Type
2在列表中排在第一位,然后是1和3.
是否有一个简单的解决方案,或者我将不得不自定义OrderBy?
答案 0 :(得分:6)
几个解决方案:
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)。
这是真的吗,它可以改变,我们不知道。
答案 1 :(得分:0)
为了简化示例,我删除了从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)来表示排序器的结束。快乐可以更好的方式处理,就像给你的想法一样。此时算法是通用的,不需要对首选值进行任何硬编码检查(只是快乐)。
有一些潜在的低效率,但我只是想展示这个解决方案的一般想法,还有一些更有效的工作可以完成。
答案 2 :(得分:0)
在这里,您有5种方法可以完成此任务。它是关于如何将值设置为订单中的第一个,然后输入较低值的帖子,以及高于所选订单的值之后的帖子,如果您有{1 2 3 4 5 6}
并选择项目 4 < / strong>,输出:{4 1 2 3 5 6}
..我更喜欢自己的答案.. ^ _ ^