这是我的问题。我有一个数据列表,按dateStart排序:
index dateStart dateEnd value
[0] 2009-11-01 04:20 2009-11-01 05:40 5
[1] 2009-11-01 06:30 2009-11-01 08:42 10
[2] 2009-11-01 07:43 2009-11-01 16:12 0
[3] 2009-11-01 10:43 2009-11-01 14:34 -12
[4] 2009-11-01 12:34 2009-11-01 12:42 3
我想要的最终输出将是该列表的子集,其中来自2个不同项的dateStart和dateEnd永远不会发生冲突。
在当前示例中,我将从[0]开始并保留它
对于[1],因为它的dateStart> [0] .dateEnd,我也会保留它。
对于[2],因为它的dateStart< = [1] .dateEnd,我会丢弃它。
对于[3],因为它的dateStart> [2] .dateEnd,我会保留它。
对于[4],由于它的dateStart< = [3] .dateEnd,我会丢弃它。
等等。
如果可能,我想使用LINQ(首选lamda)。
否则,我想循环的标准就可以了。
另一种获得最终输出的有趣方法是保留所有数据,但为每个项目添加一个标志(bValid),表明是否要采集数据。
谢谢! 附:抱歉格式化,我尽力了(这里的第一篇文章)
答案 0 :(得分:2)
我认为你在一个案例中有错误:
For [3], since its dateStart > [2].dateEnd, I would keep it.
10:43 > 16:12 --> False
我认为这涵盖了你的要求。虽然我不知道您是否要检查先前丢弃的物品的EndDate
或最后接受的物品。
IEnumerable<MyObj> res = l.Where((o,i) => {
if (i == 0)
return true;
else
return o.DateStart > l.ElementAt(i-1).DateEnd;
});
这只输出:
0 01-11-2009 4:20:00 01-11-2009 5:40:00 5
1 01-11-2009 6:30:00 01-11-2009 8:42:00 10
因为早期的高日期16:12。
<强> (更新) 强>
好的,我看到了你的评论。这完全改变了一切。试试这个:
static IEnumerable<MyObj> MyFilter(IEnumerable<MyObj> input)
{
MyObj aux = input.First();
yield return aux;
foreach (var o in input.Skip(1))
{
if (o.DateStart > aux.DateEnd)
{
aux = o;
yield return aux;
}
}
}
输出:
0 01-11-2009 4:20:00 01-11-2009 5:40:00 5
1 01-11-2009 6:30:00 01-11-2009 8:42:00 10
3 01-11-2009 10:43:00 01-11-2009 14:34:00 -12