对列表进行排序,使特定值最终排在最前面

Wes*_*ley 13 c# linq generics list

我有一个Offer包含提交类别的类.

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

我尝试了这个,但无济于事,你会推荐什么?

Offers = Offers.OrderBy(x => x.Category == "Corporate").ToList();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 28

按布尔值false(0)排序时true(1).要首先获取与谓词匹配的元素,您应该使用OrderByDescending以下内容来反转排序顺序:

Offers = Offers.OrderByDescending(x => x.Category == "Corporate").ToList();
Run Code Online (Sandbox Code Playgroud)

  • +1.也许添加一个ThenBy(x => x.Category)来按类别名称对剩余的商品进行排序..? (3认同)
  • 我对依赖 false 和 true 的顺序以及其他开发人员会理解它犹豫不决。我倾向于明确我的意图,例如`.OrderBy(x => x.Category == "Corporate" ? 0 : 1)`。 (3认同)

Oli*_*bes 15

C#语言规范5.0不指定一个字节表示truefalse值.因此,最好不要依赖于由... true表示的假设1.此外,布尔表达式排序的结果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(); 
Run Code Online (Sandbox Code Playgroud)