代码之家  ›  专栏  ›  技术社区  ›  Bruno

通缉:遵循特定日期规则的数据列表

  •  2
  • Bruno  · 技术社区  · 15 年前

    
    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
    

    我想要的最终输出是该列表中的一个子集,其中来自两个不同项目的dateStart和dateEnd永远不会冲突。

    在当前示例中,我将从[0]开始并保留它。
    对于[1],自其开始日期起>[0]。dateEnd,我也会保留它。

    对于[3],自其开始日期起>[2] .dateEnd,我会保留它。

    等等

    如果可能的话,我想使用LINQ(lamda优先)。

    获取最终输出的另一个有趣的方法是保留所有数据,但在每个项目中添加一个标志(bValid),这将指示是否获取数据。

    谢谢 p、 抱歉格式化,我已经尽力了(第一篇文章)

    1 回复  |  直到 15 年前
        1
  •  2
  •   bruno conde    15 年前

    我认为您在一个案例中有一个错误:

    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