【问题标题】:OrderByDescending - specific data 1st and then rest in orderOrderByDescending - 第一个特定数据,然后按顺序排列
【发布时间】:2021-12-03 11:57:54
【问题描述】:

我们有如下数据

Created On Supplier
01-Nov-21 ABC
02-Nov-21 XYZ
15-Nov-21 ABC
20-Nov-21 MNO
25-Nov-21 ABC

所以我们希望按创建的降序记录,但首先希望所有“ABC”记录在顶部。

我试过这个,但没有用。

object.OrderByDescending(m => m.name== "ABC").ThenBy(x => x.CreatedOn)

所以不是按如下方式获取记录

01-Nov-21   |   ABC  
15-Nov-21   |   ABC
25-Nov-21   |   ABC  
02-Nov-21   |   XYZ  
20-Nov-21   |   MNO 

它的顺序与上面相同,即基于 createdOn 字段

我有什么遗漏吗?

【问题讨论】:

  • 你必须解释一下“不起作用”是什么意思。
  • 您是否重新分配了结果? object = object.OrderByDescending()
  • @gkb:不,它期望返回一个值,该值是排序的关键。在这种情况下,bool.
  • 排序本身按预期工作。但它不能就地工作(例如在 javascript 中),因此它不会修改原始集合,而是返回一个新集合,您必须将其分配给变量

标签: c# sorting


【解决方案1】:

按创建的降序排列,但第一个希望所有“ABC”记录在顶部

您需要使用ThenByDescending - 最初使用OrderByDescending 不会将日期的排序设置为降序

我个人认为您不应该在第一个子句中对布尔值进行排序,因为对于每个人来说,布尔值如何排序并不明显。我建议您使用 bool 生成一个 int 进行排序,而不是必须记住/查找它,因为每个人都可以轻松理解您的意图(每个人都可以将 0 和 1 按升序排列):

foreach(var x in list.OrderBy(m => m.name == "ABC" ? 0 : 1).ThenByDescending(x => x.CreatedOn))
  //process your objects in turn here

要实现“日期降序但所有 ABC 在顶部”,您首先要对某事物是否为 ABC 进行排序(请记住,这是一个精确的、区分大小写的匹配,除非此查询被转换为 SQL 并发送到像 SQL 服务器这样的数据库,其中区分大小写取决于正在排序的列的排序规则/可能会忽略尾随空格),那么您希望使用ThenByDescending 对日期降序进行排序。

【讨论】:

  • 没有被否决,但这肯定不会帮助 OP 解决他的问题,因为它是相同的结果。不过,人们可能会发现这或多或少是可读的。 truefalse“高”,这就是为什么 OP 的方法是 should work
  • 这是一个意见,应该是一个评论。它没有回答问题。
  • 一个可以bool排序:顺序是false < true:public struct Boolean : IComparable, IConvertible, IComparable<Boolean>, IEquatable<Boolean>referencesource.microsoft.com/#mscorlib/system/…
  • 是的,但我的意思是它不是很一目了然 - 要求任何人“按降序排列 0 和 1”,他们就能做到蝙蝠..“按降序排列真假”可能会引发“什么?”
  • 我们不知道为什么 OP 的代码不起作用,因为他们没有定义“不起作用”,但是给出的答案中的代码符合排序要求规范中给出问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多