【问题标题】:Wanted : List of data following certain rules concerning datesWanted : 遵循有关日期的某些规则的数据列表
【发布时间】:2009-11-21 06:01:07
【问题描述】:

这是我的问题。我有一个数据列表,按 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 对于 [3],由于它的 dateStart > [2].dateEnd,我会保留它。
对于 [4],由于它的 dateStart

等等。

如果可能,我想为此使用 LINQ(首选 lamda)。
否则,我想一个标准的 for 循环就可以了。

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

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

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    我认为你有一个错误:

    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
    

    因为 EndDate 16:12 早。

    (更新)

    好的,我看到了你的 cmets。这完全改变了事情。试试这个:

        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
    

    【讨论】:

    • 您好,感谢您的回复!您正确地发现了这一点,但是应该保留 [3],因为我忘记在原始问题中解释另一个概念...实际上,我选择 [3] 是因为它的 dateStart > [last item that I keep].dateEnd,这是 [1] 并且它的 dateEnd 是 08:42
    • 所以它并不总是检查之前的项目(索引 - 1),而是检查我保留的最后一个项目......
    猜你喜欢
    • 2017-10-26
    • 2023-03-05
    • 1970-01-01
    • 2020-09-26
    • 2016-10-23
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多