2009-11-20 64 views
2

这里是我的问题。我有数据,通过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 

,我想会是从该列表中,其中dateStart和dateEnd从2名不同的项目绝不会发生冲突的一个子集的最终输出。

在当前的例子中,我会从[0]开始并保留它。
对于[1],自dateStart> [0] .dateEnd以来,我也会保留它。
对于[2],自从dateStart < = [1] .dateEnd,我会放弃它。
对于[3],因为它的dateStart> [2] .dateEnd,我会保留它。
对于[4],自从dateStart < = [3] .dateEnd,我会放弃它。

等等。

如果可能,我想使用LINQ(lamda首选)。
否则,我猜一个标准的循环会做的伎俩。

获得我最终输出的另一个有趣的方法是保留所有数据,但为每个项目添加一个标志(bValid),这表示数据是否被采用。

谢谢! p.s.遗憾的格式,我尽力(先到这里后)

回答

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 
+0

你好,感谢您的回复! 你发现正确,但[3]应该保留,因为我忘记解释我原来的问题中的另一个概念... 事实上,我[3]因为它的dateStart> [我保留的最后一个项目] .dateEnd,这是[1]和它的日期结尾是08:42 – ibiza 2009-11-20 16:40:03

+0

因此它不总是检查项目之前(索引 - 1),而是在我保留的最后一个项目... – ibiza 2009-11-20 16:42:05

+0

@ibiza,请看我最新的答案。 – 2009-11-20 16:55:36

相关问题