通缉:遵循有关日期的某些规则的数据列表

时间:2009-11-20 15:51:26

标签: c# .net linq

这是我的问题。我有一个数据列表,按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),表明是否要采集数据。

谢谢! 附:抱歉格式化,我尽力了(这里的第一篇文章)

1 个答案:

答案 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