【问题标题】:LINQ - sort on multiple columnsLINQ - 对多列进行排序
【发布时间】:2017-02-27 18:04:30
【问题描述】:

我有一个包含以下值的集合:

ID | OtherId
1    0
2    0
3    1
3    2
3    3
4    1
4    2
4    3
5    0
6    0

有没有办法使用 LINQ 以以下排序方式获取输出?

ID | OtherId
1    0
2    0
3    1
4    1
3    2
4    2
3    3
4    3
5    0
6    0

【问题讨论】:

  • 使用 orderby 子句
  • 我怀疑预期的结果根本不是一个有序列表?如果是,为什么 [5 0] 和 [6 0] 不应该跟在 [1 0 ] 和 [2 0] 对之后或者应该是第一列排序,不是吗?
  • 你需要解释一下规则是什么。按照目前的情况,您的问题无法回答,因为您没有向我们提供足够的信息来说明排序标准是什么。

标签: linq sorting multiple-columns


【解决方案1】:

您需要使用 OrderBy 和 ThenBy:

我没有尝试过,但由于您的最后 2 行“乱序”,您需要先按(非)特定值排序,然后按列排序。它会是这样的:

var sorted = table
             .Where(x => x.SomeColumn == someValue)
             .OrderBy(x => x.ID != 5)
             .ThenBy(x => x.ID != 6)
             .ThenBy(x => x.OtherId)
             .ThenBy(x => x.ID)
             .ToList();

如果您不想按特定值排序,则需要进行 2 次查询和联合:

var valueAtWhichSortingLogicChanges = 4;
var sorted = table
             .Where(x => x.ID <= valueAtWhichSortingLogicChanges)
             .OrderBy(x => x.OtherId)
             .ThenBy(x => x.ID)
             .ToList();

sorted.AddRange(table
             .Where(x => x.ID > valueAtWhichSortingLogicChanges)
             .OrderBy(x => x.OtherId)
             .ThenBy(x => x.ID)
             .ToList());

【讨论】:

  • 这将首先按“OtherId”排序,然后按“Id”排序。这没有给出预期的结果。因为我需要基于两列的排序列表。查看输出列表。
  • 有没有办法在不硬编码任何值的情况下实现这一点?因为我的集合会有随机值。以上只是一个示例,以了解问题。
  • @Rakshith,我不确定您是否理解为什么没有硬编码就无法进行排序。没有逻辑排序会说“先按第二列排序,然后按第一列排序,除非第一列大于 4。然后将它们放在最后,然后按第二列排序,然后按第一列排序。”这有意义吗?
  • @Rakshith 更有帮助的是以这种方式对值进行排序的确切逻辑......从你的例子来看,它似乎完全是任意的。
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多