2009-11-20 25 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

相關問題