使用Datetime通过ID获取列表的最后元素的最快方法是什么?

时间:2014-03-10 10:09:08

标签: c# linq list datetime timestamp

我有一个巨大的List<MyObject>MyObject有一个名为时间戳DateTime?)和代码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;
}

它有效,但我的表现非常差,输入量很大......

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

2 个答案:

答案 0 :(得分:4)

我建议使用MaxBy扩展方法。它将节省您必须执行完整的排序只选择顶部项目,因此将具有更有利的记忆特征,并且最有可能更快。 morelinq包中有一个。

因此...

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

答案 1 :(得分:2)

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

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