【问题标题】:OrderBy 3 different properties [duplicate]OrderBy 3个不同的属性[重复]
【发布时间】:2016-08-01 20:07:05
【问题描述】:

为了便于解释...假设我有一个由数据库中的表生成的表..

此表包含 3 条信息,FlightDateAircraftPre / Post

所以,这背后的逻辑是每天应该有一个飞行前和一个飞行后

现在,为了清楚起见,假设到目前为止的表格如下所示:

  |Date|    |    |Aircraft|    |    |Pre / Post|

 04/08/2016 |     aircraft1    |      Pre-Flight
 04/08/2016 |     aircraft3    |      Pre-Flight
 04/08/2016 |     aircraft2    |      Pre-Flight
 04/08/2016 |     aircraft3    |      Post-Flight
 04/08/2016 |     aircraft1    |      Post-Flight
 04/08/2016 |     aircraft2    |      Post-Flight

如您所见,该表没有订单(可能日期除外,但我只是编造的)。

现在我想要发生的是当页面加载以显示此表时,该表由Aircraft 排序,它是基于DatePre / Post...

所以基本上我正在寻找:

  |Date|     |    |Aircraft|    |    |Pre / Post|

 04/08/2016  |     aircraft1    |     Pre-Flight
 04/08/2016  |     aircraft1    |     Post-Flight
 04/08/2016  |     aircraft2    |     Pre-Flight
 04/08/2016  |     aircraft2    |     Post-Flight
 04/08/2016  |     aircraft3    |     Pre-Flight
 04/08/2016  |     aircraft3    |     Post-Flight
 04/09/2016  |     aircraft1    |     Pre-Flight
 04/09/2016  |     aircraft1    |     Post-Flight
 etc         |     etc          |     etc

有没有办法使用 .OrderBy 方法来实现这个结果?

【问题讨论】:

    标签: c# linq asp.net-mvc-5


    【解决方案1】:

    您可以将多个OrderBy() 调用链接在一起,方法是分别在第一个调用后面加上ThenBy()ThenByDescending()

    // This would order by FlightDate, Aircraft then PrePost
    var aircraftFlights = context.AircraftFlights.OrderBy(a => a.FlightDate)
                                                 .ThenBy(a => a.Aircraft)
                                                 .ThenBy(a => a.PrePost);
    

    由于您希望您的 Pre-flight 值始终在您的 Post-flight 值之前,您可能会考虑为该列显式使用 OrderByDescending()(作为 Pre- 在 Post- 之后按字母顺序排列):

    // Consider using ThenByDescending to get your Pre/Post ordering correct
    .ThenBy(a => a.PrePost);
    

    您可以根据自己的需要进行定制。基本上,一旦你调用了你的第一个 OrderBy() 调用,你的集合就变成了一个 OrderedEnumerable,它公开了 ThenBy()ThenByDescending() 调用并将它们链接在一起。

    【讨论】:

    • 打败我! ;) 也许您想复制我最常用的 MSDN 参考资料以使其成为完整的答案?
    • 我所有的方法都应该指向它们各自的 MSDN 引用。蓝灰色总是比纯灰色 IMO 看起来更好。 :)
    • 你也打败了我。 :D 那么就没有什么可补充的了。
    • 感谢@RionWilliams,您对我最近的大部分问题都提供了很大的帮助,哈哈
    【解决方案2】:

    对于要应用的每个排序约束,您可以使用 OrderBy 和 ThenBy 调用。假设您要订购的枚举具有所有三个属性,它可能如下所示:

    myEnumerable.OrderBy(x => x.Aircraft).ThenBy(z => z.PrePost).ThenBy(a => a.Date);
    

    【讨论】:

    • 他想先按日期排序。
    • 那个,OP 需要按日期/飞机 before PrePost 订购。所以这里的整个排序都是错误的。
    • 我更多的是试图展示语法,而不是担心 OP 想要实现的确切顺序。
    【解决方案3】:

    您需要使用 lambda 组合 OrderByThenBy 来评估 Pre/Post 列。所以是这样的:

    var orderedTable = table.OrderBy(t => t.Aircraft).
        ThenBy(t => t.Date).
        ThenBy(t => t.PrePost == "Post-Flight" ? 1 : 0);
    

    【讨论】:

      【解决方案4】:

      使用 System.LinQ 的 ThenBy 扩展名。

      您的代码可能如下所示:

      var ordered = myFlights.OrderBy(f => f.Aircraft)
                             .ThenBy(f => f.prePost)
                             .ThenBy(f => f.Date);
      

      参考请查看MSDN documentation

      【讨论】:

      • 这不仅基本上直接抄袭了 DavidY 之前的回答,就像大卫的回答一样,这里的排序完全错误。
      • 我在发送我的帖子后才看到他的帖子,公平地说,除了订单之外,所有答案都是相同的,我承认我误解了那个。
      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 2014-09-25
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2017-04-20
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多