我有一个巨大的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;
}
它有效,但我的表现非常差,输入量很大......
您知道如何优化此功能吗?按时间戳为每个代码获取最后一个元素的最快方法是什么?
答案 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();