2010-04-16 55 views
4

如果我有一雙日期,我想生成它們之間的所有日期(含)的名單,我可以這樣做:爆炸的日期範圍與LINQ

System.DateTime s = new System.DateTime(2010, 06, 05); 
System.DateTime e = new System.DateTime(2010, 06, 09); 
var list = Enumerable.Range(0, (e - s).Days) 
    .Select(value => s.AddDays(value)); 

我我堅持的是,我已經列出了一系列日期對,我想將它們分解成它們之間所有日期的列表。例如:

{2010-05-06, 2010-05-09}, {2010-05-12, 2010-05-15} 

應導致

{2010-05-06, 2010-05-07, 2010-05-08, 2010-05-09, 2010-05-12, 2010-05-13, 2010-05-14, 2010-05-15} 

注日期的對保證不會彼此重疊。

+2

TimeSpan.Days **!= ** TimeSpan.TotalDays http://msdn.microsoft.com/en-us/library/system.timespan.days(v=VS.100)。 aspx http://msdn.microsoft.com/en-us/library/system.timespan.totaldays(v=VS.100).aspx – dtb 2010-04-16 17:58:32

+0

是的,Days!= TotalDays,但是Days是我想要的。請參閱您提供的鏈接中的示例: TimeSpan(1).Days == 0; TimeSpan(1).TotalDays == 1.15740740740741E-12; TimeSpan(111222333444555).Days == 128; TimeSpan(111222333444555).TotalDays == 128.729552597865; 在第一個例子中,循環0..0會給我一天,這是我想要的。 在第二個示例中,循環0..128將提供129天,這也是我想要的。我想我可以循環1..ceil(128.729552597865),然後返回s.AddDays(值-1),但我爲什麼? – 2010-04-16 19:24:47

+0

只需指出,當兩個「DateTime」值相距超過一個月時,使用'Days'就會中斷。 :) – dtb 2010-04-16 20:34:13

回答

5
var result = listOfPairs.SelectMany(pair => 
       Enumerable.Range(0, (pair.Item2 - pair.Item1).TotalDays) 
          .Select(days => pair.Item1.AddDays(days))); 
+0

如果「返回」丟失,這看起來不錯。 – 2010-04-16 18:05:43

+0

答案更新爲沒有'return':) – dtb 2010-04-16 18:10:18

+0

是的,這正是我所尋找的:LINQy可擴展的方法。太好了,謝謝。 – 2010-04-16 19:41:13

0

我想你可以使用一個簡單的List<DateTime>來完成你想要的。

List<DateTime> list = new List<DateTime>(); 
list.AddRange(GetListDates(d1, d2)); 
list.AddRange(GetListDates(d3, d4));