【问题标题】:What is the fastest way to get the last elements of a list by ID with Datetime?使用日期时间按 ID 获取列表最后一个元素的最快方法是什么?
【发布时间】:2014-03-10 10:09:08
【问题描述】:

我有一个巨大的List<MyObject>MyObject 有一个名为 Timestamp (DateTime?) 的属性和一个 Code (string)。 我需要按每个代码的时间戳获取最后一个对象。

例如使用以下输入:

Code| A   | B   | Timestamp
A1  | ABC | DEF | Fri 7 Mar 2014 
B2  | ABC | GHI | Thu 6 Mar 2014 
A1  | DEF | GHI | Mon 10 Mar 2014 
B2  | DEF | GHI | Fri 7 Mar 2014 
C3  | GHI | JKL | Fri 7 Mar 2014 

我需要得到这个:

Code| A   | B   | Timestamp
A1  | DEF | GHI | Mon 10 Mar 2014 
B2  | DEF | GHI | Fri 7 Mar 2014 
C3  | GHI | JKL | Fri 7 Mar 2014 

为了做到这一点,我做了以下功能:

private List<MyObject> GetLastsObjects(List<MyObject> input)
{
    var output = input.Where(x => x.Timestamp == x.Where(y => y.Code == y.Code)
                                                               .Max(tmp => tmp.Timestamp))
                      .ToList();
    return output;
}

它有效,但我的表现真的很糟糕,输入量很大......

你知道我该如何优化这个功能吗?按每个代码的时间戳获取最后一个元素的最快方法是什么?

【问题讨论】:

    标签: c# linq list datetime timestamp


    【解决方案1】:

    我建议使用MaxBy 扩展方法。它将使您不必执行完整的排序来选择最上面的项目,因此将具有更有利的记忆特性并且很可能会更快一些。 morelinq 包中有一个。

    所以...

    input.GroupBy(x => x.Code).Select(g => g.MaxBy(x => x.TimeStamp))
    

    【讨论】:

      【解决方案2】:

      一种方法是按代码对对象进行分组,按时间戳对每个组进行反向排序并获得每个组的第一个结果:

      var output = input
          .GroupBy(o => o.Code)
          .Select(g1 => g1.OrderByDescending(g2 => g2.Timestamp).First())
          .ToList();
      

      【讨论】:

      • 我理解逻辑,但您的代码返回 List&lt;DateTime?&gt; 而不是 List&lt;MyObject&gt; 必需的:/
      • @Alex:啊。我最初有一个正确的版本(回滚,你现在可以再次看到它)但后来认为你只想要时间戳。
      猜你喜欢
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 2020-07-07
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多