2015-07-02 60 views
1

我有如下日期的集合進行比較,如何從沒有fromdate&TODATE名單得到一個日期範圍與另一個日期

var dateList = new List<DatePrev> 
{ 
    new DatePrev{ FromDate=new DateTime(2014,10,1), ToDate=new DateTime(2015,3,1)}, 
    new DatePrev{ FromDate=new DateTime(2013,2,1), ToDate=new DateTime(2013,10,1)}, 
    new DatePrev{ FromDate=new DateTime(2010,2,1), ToDate=new DateTime(2011,10,1)} 
}; 

這個列表作爲查找列表。 我有如下一個搜索數據,

var newDate = new DatePrev { FromDate = new DateTime(2015, 2, 1), ToDate = new DateTime(2017, 5, 1) }; 

我想搜索的dateList集裏面找出供應newdate是否可以插入內dateList適當的日期範圍。 由於所提供的日期列表的日期早於日期列表第一行的日期列表,因此不應允許插入。

+1

我不清楚你在問什麼。只有當它不與任何現有範圍重疊時,你纔想添加新的日期範圍? –

+0

是的。對不起,在完整的問題。 – Zafar

回答

1

如果我正確理解你的問題,你要找的是檢查兩個「日期跨度」是否重疊的方法。

我,我自己,最近有這樣的問題,而且解決方案相當簡單。

定義爲給定兩個日期:與BstartBend

  • 日期與AstartAend
  • 日期B可以決定他們是否重疊,如果: !(Aend < Bstart || Astart > Bend)

    因此,你可以寫下面的co DE:

    class DatePrev 
    { 
        public DateTime FromDate { get; set; } 
        public DateTime ToDate { get; set; } 
    
        public static bool Overlap(DatePrev dateA, DatePrev dateB) 
        { 
         return !(dateA.ToDate < dateB.FromDate || dateA.FromDate > dateB.ToDate); 
        } 
    } 
    
    (...) 
    
         var newDate = new DatePrev(); //specify from and to 
    
         if (!dateList.Any(d => DatePrev.Overlap(d, newDate))) 
          dateList.Add(newDate); 
    

    的代碼假定一個DatePrev含 「理智的」 值 - 即ToDate > FromDate。此外,您可能需要調整條件,具體取決於您是將開始/結束日期視爲包含還是排除在外(在需要的地方將<or>更改爲<= or =>)。

0

如果您需要添加newDate只有當日期範圍已添加不與新的重疊現有列表,你可以這樣做:

bool slotTaken = dateList.Any(x => (x.FromDate <= newDate.FromDate && 
            x.ToDate >= newDate.FromDate) || 
            (x.x.FromDate <= newDate.ToDate && 
            x.ToDate >= newDate.ToDate); 

if (!slotTaken) 
{ 
    dateList.Add(newDate); 
} 

請注意,比較條件可以根據改變根據您對範圍相等的情況的要求。如果newDate.FromDatenewDate.ToDate等於存儲的日期,則當前解決方案會拒絕新的時間間隔。這意味着,根據你的例子,new DatePrev { FromDate = new DateTime(2015, 3, 1), ToDate = new DateTime(2017, 5, 1) };將被拒絕。如果允許相同的日期,您可以在比較中簡單地刪除=,但是您需要考慮兩個結束日期相等的特殊情況(即日期範圍已經添加)。

相關問題