【发布时间】:2015-04-16 10:29:53
【问题描述】:
我有一个包含 500.000 到 1.000.000 个 MyClass 实例的列表,它具有以下属性:
class MyClass
{
string ParentId;
string Name;
DateTime StartDate;
DateTime EndDate;
}
数据可能如下所示:
ParentId | Name | StartDate | EndDate
----------------------------------------------
parent1 | alpha | 01-01-2011 | 02-02-2015
parent1 | beta | 01-01-2011 | 02-02-2014
parent2 | gamma | 01-01-2012 | 02-02-2011
我需要过滤列表,使其包含“alpha”和“gamma”对象。应该排除“beta”对象,因为它与 alpha 具有相同的父对象,但 EndDate 更早。
即结果列表应该只包含每个 ParentId 的一个实例(具有最新 EndDate 的那个)。
过滤需要表现良好。
【问题讨论】:
-
myClasses.Where(x => x.Name == "alfa" || x.Name == "gamma").Distinct(),它应该是高效的 - 如果您想了解速度有多快,请使用System.Timer() -
过滤和删除不一样。你在问什么?你是什么意思“表现良好”?存储了多少对象?树有多深?对于大量和/或深度树,您需要树结构
-
你不应该在数据库中这样做吗?
-
为什么这么多?它们是从数据库加载的吗?为什么不在数据库中过滤它们?无论如何,有这么多的项目,你需要一个专门的树集合,而不是一个简单的列表,特别是如果有很多或很深的父子关系。
-
@callum 类似于第一个答案,但都未通过 EndDate 比较进行检查。如果我理解预期结果,过滤不是在名称 == 'alpha' 或 'gamma' 上,而是在 ParentID && where max EndDate 上的 group --> 基于示例导致 alpha 和 gamma 记录。
标签: c# linq lambda ienumerable