1

我有一个DataSet包含一列的列,称它为Type包含整数。我正在使用 LINQ 来操作DataSet并且我想按Type. 该Type列现在仅包含 3 个值(1、2、3)。我想排序,以便Type2 在列表中排在第一位,然后是 1 和 3。

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

4

3 回答 3

7

几个解决方案:

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)。

这是真的吗,能不能改变,我们不知道。

于 2012-09-26T15:05:01.287 回答
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) 表示排序器的结束。欢乐可以以更好的方式处理,就像这样只是为了给你一个想法。在这一点上,算法是通用的,不需要对首选值进行任何硬编码检查(只是快乐)。

有一些潜在的低效率,但我只是想展示这个解决方案的总体思路,通过更多的工作可以更有效地完成。

于 2012-09-26T15:45:11.563 回答
0

在这里,您有 5 种方法可以做到这一点。这是一篇关于如何将值设置为第一个订单的帖子,然后将值设置为较低的值,然后放入高于所选值的值,因此如果您有{1 2 3 4 5 6}并选择第 4项,则输出:{4 1 2 3 5 6}.. 我更喜欢我自己的答案。 . ^_^

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

于 2012-09-26T15:58:08.157 回答