2017-02-28 43 views
0

我有一個對象,包括日期範圍算法找到並修復日期區域相交

public class MyObject 
{ 
    public int Id {get; set;}   

    public string Name {get; set;} 

    public DateTime StartDate {get; set;} 

    public DateTime EndDate {get; set;} 
} 

我希望能夠在爲MyObject的一個實例傳遞和檢查,以確保已經相交的所有其他對象日期,如

var myObj = new MyObject 
    { 
     Id = 1, 
     Name = "Test", 
     StartDate = new Date(2017, 3,1), 
     EndDate = new Date(2017, 3,10) 
    }; 

foreach(var objInList in objList) 
    { 
      bool done = false; 
      //if both dates are inside rnage 
      if (objInList.StartDate <= myObj.StartDate && myObj.StartDate <= objInList.EndDate 
       && objInList.StartDate<= myObj.EndDate && myObj.EndDate<= objInList.EndDate) 
      {// update start and end 

       done = true; 
      } 
      // if start of new item is in range, but end isnt 
      else if (objInList.StartDate<= myObj.StartDate && myObj.StartDate <= objInList.EndDate) 
      { 
       if (!done) 
       { 
        done = true; 
       } 
      } 
      // if both dates are inside range 
      else if (objInList.StartDate<= myObj.EndDate && myObj.EndDate <= objInList.EndDate) 
      { 
       if (!done) 
       { } 
      } 
    } 

基本上我需要更新objInList以確保在循環後沒有日期相交。我很難將邏輯放在合適的位置,而不會變得過於複雜。

+0

這裏有什麼'Date'類型?這是你自己的類型嗎?如果你提供了一個[mcve]的正確縮進代碼和樣本輸入/預期輸出,那真的會有所幫助 - 我發現很難理解你想在這裏實現什麼。 –

+0

對不起.Net DateTime。我更新了這個例子。我期待檢查myObj的日期是否與objList中的任何日期範圍相交。那有意義嗎? –

+0

那麼好,但它不像「日期範圍」那麼「日期」。我建議您可能想要做的第一件事是創建一個'DateRange'類型,您可以放置​​大部分邏輯。 (你所顯示的格式不正確的代碼只會設置「完成」 - 這不會做任何其他事情。)再一次,[mcve]會更有用。 –

回答

0

檢查日期範圍內的代碼相交如下:

MyObject a = ... 
MyObject b = ... 
DateTime maxStart = a.StartDate > b.StartDate ? a.StartDate : b.StartDate; 
DateTime minEnd = a.EndDate < b.EndDate ? a.EndDate : b.EndDate; 
bool intersect = (maxStart < minEnd); 
+0

對不起,這是一個日期時間。我更關心更新交叉點發生的obj的日期。這是否有道理 –

+0

@IsaacLevin移除路口絕對取決於你。在檢測到重疊後,提出一個策略。可能性的數量是無限的,所以你需要選擇一種策略。當一個區間完全包含另一個區間時,你需要決定當區間簡單地相交時(拉入/拉出開始,選擇中間等)與做什麼時要做什麼(放下兩個物體中的一個?用於表示剪輯的其他對象?) – dasblinkenlight

0

我希望我可以幫助你:

private bool IsTimeBetween(DateTime theTime, DateTime startTime, DateTime endTime) 
    { 
     if (theTime >= startTime && theTime <= endTime) 
      return true; 
     else 
      return false; 
    } 

    private void check() 
    { 
     MyObject myObj = new MyObject 
     { 
      Id = 1, 
      Name = "Test", 
      StartDate = new DateTime(2017, 3, 1), 
      EndDate = new DateTime(2017, 3, 10) 
     }; 

     List<MyObject> objList = new List<MyObject>(); 

     foreach (var objInList in objList) 
     { 
      if (objInList.StartDate >= objInList.EndDate) 
       continue; 

      if (IsTimeBetween(objInList.StartDate, myObj.StartDate, myObj.EndDate) 
       || IsTimeBetween(objInList.EndDate, myObj.StartDate, myObj.EndDate)) 
      { 
       //intersects 
      } 

      if (objInList.StartDate < myObj.StartDate && objInList.EndDate > myObj.EndDate) 
      { 
       //intersects 
      } 
     } 
    }