LINQ OrderBy有一个例外

时间:2012-09-26 15:03:27

标签: c# .net linq

我有一个包含列的DataSet,称之为Type,其中包含整数。我正在使用LINQ来操纵DataSet,我希望按Type排序。 Type列目前仅包含3个值(1,2,3)。我想排序,以便Type 2在列表中排在第一位,然后是1和3.

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

3 个答案:

答案 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} ..我更喜欢自己的答案.. ^ _ ^

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