2013-03-23 40 views
4

我想創建一個linq查詢,將產生一個日期範圍的集合與容量值的總和考慮到範圍可以重疊的帳戶,我想要一個總和和該重疊期間的不同日期範圍。謝謝。LINQ查詢日期範圍內的總和值

public ActionResult Index() 
     { 
      List<Capacities> _list = new List<Capacities>{ 
       new Capacities {StartDate = DateTime.Parse("01/01/2013"), StopDate = DateTime.Parse("01/01/2013 06:00"), Capacity = 100}, 
       new Capacities {StartDate = DateTime.Parse("01/01/2013 04:00"), StopDate = DateTime.Parse("01/02/2013 00:00"), Capacity = 120}, 
       new Capacities {StartDate = DateTime.Parse("01/04/2013"), StopDate = DateTime.Parse("01/04/2013 15:00"), Capacity = 100}, 
       new Capacities {StartDate = DateTime.Parse("01/04/2013 15:00"), StopDate = DateTime.Parse("01/04/2013 18:00"), Capacity = 150} 
      }; 
      //results expected 
      //01/01/2013 00:00 - 01/01/2013 04:00 100 
      //01/01/2013 04:00 - 01/01/2013 06:00 220 
      //01/01/2013 06:00 - 01/02/2013 00:00 120 
      //01/04/2013 00:00 - 01/04/2013 15:00 100 
      //01/04/2013 15:00 - 01/04/2013 18:00 150 
      return View(); 
     } 

     public class Capacities 
     { 
      public DateTime StartDate { get; set; } 
      public DateTime StopDate { get; set; } 
      public int Capacity {get;set;} 
     } 
+0

你有什麼嘗試?你有循環解決方案,並希望將其轉換爲LINQ?你會接受沒有LINQ的解決方案嗎? – 2013-03-23 11:34:58

+0

希望能夠替換一些將遍歷集合的舊代碼並拆分重疊範圍,然後遍歷它來總結創建新數組的容量。是的,我正在尋找一個linq查詢。謝謝。 – user177194 2013-03-23 11:41:04

+0

我想我可以想出一些LINQ,但它不會很漂亮。前一種解決方案可能更易於理解。 – 2013-03-23 11:55:06

回答

3

我做了一些編程,但是我擴展了很多代碼。但我可以使用LINQ的盡頭:-)

我的代碼:

SortedSet<DateTime> splitdates = new SortedSet<DateTime>(); 
foreach (var item in _list) 
{ 
    splitdates.Add(item.Period.Start); 
    splitdates.Add(item.Period.End); 
} 

var list = splitdates.ToList(); 
var ranges = new List<DateRange>(); 
for (int i = 0; i < list.Count - 1; i++) 
    ranges.Add(new DateRange() { Start = list[i], End = list[i + 1] }); 

var result = from range in ranges 
      from c in _list 
      where c.Period.Intersect(range) != null 
      group c by range into r 
      select new Capacities(r.Key.Start, r.Key.End, r.Sum(a => a.Capacity)); 

完整的代碼是在這裏:http://pastebin.com/wazbb1r3 注意,輸出不同,因爲語言環境。另外,有些位不像DateRange.Contains()那樣需要。

在上面的兩個循環中,我不知道如何以可讀的方式將它們轉換爲LINQ。

+0

+ +1爲有趣的方法(即使我自己沒有嘗試代碼;)。但是我想知道是否可能有這樣的問題的一般解決方案,因爲這樣的場景對於時間表/時間表似乎很常見。例如。來自野田時間的時間間隔沒有檢查交叉路口的方法,這可能會有所幫助。 – jCoder 2013-03-23 13:15:21

+0

太棒了!這是理想的。 DateRange類非常方便,我非常欣賞linq子句。 – user177194 2013-03-23 13:47:38