【问题标题】:Sort a List so a specific value ends up on top对列表进行排序,以便特定值位于顶部
【发布时间】:2011-12-08 19:58:02
【问题描述】:

我有一个类 Offer,其中包含一个已归档的类别。

我希望特定类别的所有优惠都显示在顶部,然后是其他所有优惠。

我试过了,但没有用,你有什么推荐的?

Offers = Offers.OrderBy(x => x.Category == "Corporate").ToList();

【问题讨论】:

标签: c# linq list generics


【解决方案1】:

当您按布尔值排序时,false (0) 位于 true (1) 之前。要首先获取与谓词匹配的元素,您应该使用OrderByDescending 反转排序顺序:

Offers = Offers.OrderByDescending(x => x.Category == "Corporate").ToList();

【讨论】:

  • 呃,但这也会颠倒其他一切的顺序。请改用OrderBy(x => x.Category != "Corporate")
  • +1。也许添加一个 ThenBy(x => x.Category) 以按类别名称对剩余的报价进行排序..?
  • 我很犹豫是否要依赖 false 和 true 的顺序,而其他开发人员会理解它。我倾向于把我的意图说得很清楚,比如.OrderBy(x => x.Category == "Corporate" ? 0 : 1)
  • @BlueRaja-DannyPflughoeft 其他所有内容的顺序都是未定义的(如果 OrderBy 使用不稳定的排序,我认为确实如此)。
  • 啊,我明白了,我误解了布尔参数
【解决方案2】:

C# Language Specification 5.0 没有为truefalse 值指定字节表示。因此,最好不要依赖true1 表示的假设。此外,布尔表达式x.Category == "Corporate" 排序的结果并不明显,因为true 也可以用负值表示。因此,我使用三元运算符来显式指定排序值:

Offers = Offers
    .OrderBy(x => x.Category == "Corporate" ? 0 : 1)
    .ThenBy(x => x.Category)
    .ThenBy(x => x.Date) // or what ever
    .ToList(); 

【讨论】:

    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2014-01-01
    • 2014-01-27
    • 1970-01-01
    • 2016-09-10
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多