2017-08-04 54 views
-1

我想找到它落在輸入日期的日期範圍內找到日期範圍的列表確切日期範圍,以下是結構如何通過輸入一個日期

public class Duration 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 


var durations = new List<Duration>(); 
var duration1 = new Duration() 
{ 
    StartDate = new DateTime(2017, 08, 1), 
    EndDate = new DateTime(2017, 08, 10) 
}; 
durations.Add(duration1); 
var duration2 = new Duration() 
{ 
    StartDate = new DateTime(2017, 08, 5), 
    EndDate = new DateTime(2017, 08, 10) 
}; 
durations.Add(duration2); 
var duration3 = new Duration() 
{ 
    StartDate = new DateTime(2017, 08, 5), 
    EndDate = new DateTime(2017, 08, 6) 
}; 
durations.Add(duration3); 

現在我想找到時間最接近在輸入的日期爲<Durations>清單,LINQfor-loop

我爲currentDate=new DateTime(2017, 08, 7);預期結果爲:duration2

+0

你最好做的'DateTime' –

+0

你的意思是'StartDate'一個'Dictionary'最接近或'EndDate'最接近?你必須更具體。 *'CurrentDate'之後'EndDate'應該*嗎? – stybl

+0

開始和結束日期也最接近。 – Jitendra

回答

1

首先,您需要檢查的currentdate是每個範圍的開始和結束日期內。對於那些符合這種條件的人,可以計算兩個距離之間的「貼近度」。當你找到一個失誤(間隙)較小的黃褐色以前,你保存它的指數...瞧

int lapse = Integer.MaxValue; 
int counter = 0; 
int index = 0; 
foreach (d in durations) { 
    if (((d.StartDate <= currentDate) && (d.EndDate >= currentDate))) { 
     int newlapse = ((currentDate - d.StartDate).TotalDays + (d.EndDate - currentDate).TotalDays); 
     if ((newlapse < lapse)) { 
      lapse = newlapse; 
      index = counter; 
     } 
    }  
    counter +=1;  
} 
return durations(index); 
+0

謝謝,尋求幫助。 – Jitendra

0

如果您需要間隔中間是最接近:

durations.OrderBy((d) => Math.Abs(d.EndDate.Ticks + d.StartDate.Ticks)/2 - currentDate.Ticks).FirstOrDefault(); 

如果您需要間隔開始到最接近:

durations.OrderBy((d) => Math.Abs(d.EndDate.Ticks - currentDate.Ticks)).FirstOrDefault(); 
0

爲d以上勒

  • 首先檢查,如果是的currentdate開始和結束中提到的日期
  • 其次選擇與起始端結束日期

之間的最小差異我使用的NuGet包稱爲morelinq這給很好的擴展方法,如MinBy時間:

var result = (from d in durations 
       where (d.StartDate <= currentDate && d.EndDate >= currentDate) 
       select d).MinBy(d => d.EndDate - d.StartDate); 
相關問題