2017-05-15 49 views
0

我有一個列表,C#比較DateTime的列表C#LINQ

List<Dates> 
public class Dates 
{ 
    public DateTime Start {get; set;} 
    public DateTime End {get; set;} 
} 

在名單:

開始 - 結束

  1. 2014年3月17日09:00:00 - 2014-03-17 10:00:00
  2. 2014-03-17 10:59:59 - 2014-03-17 11:44:59

我想找到nr2,除了startToCheck和endToCheck範圍。

例如:

startToCheck = 2014-03-17 11:00:00 
endToCheck = 2014-03-17 12:00:00 

很顯然,我的startToCheck在列表NR 2,但沒有找到。

我試圖

if (Start <= startToCheck && End >= endToCheck) 

但不工作... 任何幫助,請?

感謝

+0

由於nr2'.End'大於'endToCheck',你爲什麼說nr2是正確答案?你只是在尋找任何重疊? – NetMage

+0

是的,我需要得到所有其他人 –

+0

我很困惑......在你的例子中,你的「endToCheck」超出了這兩個範圍,所以你爲什麼要返回第二個項目?你沒有真正解釋你的支票應該做什麼,只是舉了一個例子,一個例子沒有定義問題。它是否應該返回與給定範圍重疊的範圍?只有startToCheck位於範圍內且endToCheck位於後面的日期?還有別的嗎?你需要準確定義你想要的行爲,然後我們可以解釋爲什麼你的方法不起作用。 – Chris

回答

0

要找到重疊startToCheckendToCheck範圍列表中的任何成員,只要發現含有一個任何成員。

List<Dates> listOfDateRanges; 

var ans = listOfDateRanges.Where(r => (r.Start <= startToCheck && startToCheck < r.End) || (r.Start < endToCheck && endToCheck <= r.End) || 
(startToCheck <= r.Start && r.End <= endToCheck)); 
+0

不,它沒有。您錯過了'startToCheck'在範圍之前,'endToCheck'在之後的情況。雖然我想這取決於你是否在尋找任何交叉路口或只有部分路口。可悲的是,OP沒有給我們提供他們真正想要的線索...... :( – Chris

+0

我加了丟失的案例。 – NetMage

1

從你的問題(以及其他的答案不是你想要的),我推斷你想誰擁有與你正在尋找的範圍內的任何重疊的所有日期。

很難將所有案例都包含在一個簡單的邏輯陳述中。如果你反轉它會容易得多。換句話說,讓我們看看不重複的日期,然後獲取其他的。

我們將如何定義一個不重疊的範圍。嗯,它可以是兩件事情之一:

  • 它已經結束,甚至在您的搜索週期開始之前。 (發生得太早)
  • 它只在您的搜索期已結束後纔開始。 (發生爲時已晚)

這包括所有的情況下,假設開始日期不能大於結束日期更大的(你應該已經檢查!)。
所以,現在,我們顛倒了邏輯:

  • 它結束搜索週期已經開始(=沒有太早發生)
  • 它開始搜索週期結束之前( =沒有發生過晚)

如果它不是太早,這還不算太晚的話,那一定是恰到好處

public class Dates 
    { 
     public DateTime Start {get; set;} 
     public DateTime End {get; set;} 
    } 

    public List<Dates> FindOverlappingDates(DateTime beginPeriod, DateTime endPeriod) 
    { 
     var dateList = //fill in the list 

     var dateRangesThatOverlap = datelist.Where(date => 
       date.End > beginPeriod 
        && date.Start < endPeriod) 

     return dateRangesThatOverlap.ToList(); 
    } 

進一步解釋

我知道這是怪異的開始日期與期末,反之亦然匹配。但這是有道理的。如果我們認爲有效的開始日期,可以有兩種選擇:

  • 那些在開始期間你正在尋找(startPeriod < myDate.Start < endperiod
  • 那些週期開始之前你正在尋找(myDate.Start < startPeriod < endperiod

如果你看括號,你會看到一個意外的(但不可否認的)事實:myDate.Start是在startPeriod之前還是之後發生並不重要;因爲可能是正確。
但是,在兩種情況下,myDate.Start總是小於endperiod。這就是爲什麼我們匹配myDate.Startendperiod

如果myDate.Start不小於endPeriod,那麼它發生得太遲

同樣的邏輯適用於考慮myDate.Endstartperiod。如果你寫下來,你會看到相同的模式。

注意我只闡述了兩個比較的一個(因爲它們的工作原理相同),但如果你想正確的輸出,你必須同時使用。這些不能單獨工作,因爲它們都是不完整的評估(但是在一起,它們是完整的)