【问题标题】:How can I order by multiple Items using LINQ?如何使用 LINQ 按多个项目排序?
【发布时间】:2011-07-29 12:44:35
【问题描述】:

我有一个集合,我正在尝试根据以下代码获取集合中的“最新”项目:

 return MyCollection.OrderByDescending(a => a.StartDate).FirstOrDefault(a => a.StartDate.Date <= DateTime.UtcNow.Date));

这很好用,但我遇到了一个问题,我有一个示例,其中 MyCollection 中有两个条目具有相同的开始日期。 (所以我认为它任意取其中之一??)

为了处理这种情况,我想为此添加一个检查,所以如果有多个项目具有相同的开始日期,然后它会转到另一个字段来决定返回哪个,但我不想承担费用除非存在这种情况,否则检查第二个字段。

【问题讨论】:

    标签: c# linq collections


    【解决方案1】:

    使用ThenBy()ThenByDescending()

    return MyCollection.OrderByDescending(a => a.StartDate).ThenBy(a=>a.Fish).FirstOrDefault(a => a.StartDate <= DateTime.UtcNow.Date));
    

    如你所愿,最新日期的项目......

    var max=MyCollection.Where(a => a.StartDate.Date <= DateTime.UtcNow.Date).Max(a=>a.StartDate);
    result=MyCollection.Where(a=>a.StartDate == max).OrderBy(a=>a.SecondProp).First();
    

    【讨论】:

    • 这不需要'但我不想花费检查第二个字段的费用,除非这种情况存在。'在帐户中
    • @Jan Jongboom:很有可能Linq 实现实际上使用了一个组合了OrderBy 和ThenBy 表达式的组合键,因此排序只进行了一次。请参阅 Jon Skeet 的 OrderBy 和 ThenBy 实现:msmvps.com/blogs/jon_skeet/archive/2011/01/07/…
    • 无论如何,除非我分析应用程序并发现这行代码是我的瓶颈,否则我不会为这种“优化”而烦恼。
    • 更新了答案以提供仅包含最新条目的答案。这将交互集合两次,但最终可能比完整 orderby 的开销更快
    • @Bob Vale - 我很困惑。你建议第一个还是第二个答案
    【解决方案2】:

    你应该会发现有一个ThenBy /ThenByDescending 扩展。

    【讨论】:

      【解决方案3】:

      如果您使用的是ThenBy(),它总是会被执行。只有当OrderBy 的结果相等时才执行“ThenBy”的唯一方法,您必须编写自定义IComparer

      【讨论】:

        【解决方案4】:

        您可以让您的对象支持 IComparable,将您的逻辑放入其中,然后按对象本身排序.OrderBy( a =&gt; a )

        (我认为这可行...否则您可以将实现 IComparer 的对象传递给 OrderBy)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 2019-05-02
          • 1970-01-01
          • 2013-01-13
          • 2016-02-25
          • 2021-05-29
          • 1970-01-01
          相关资源
          最近更新 更多