2016-07-27 88 views
0

我得到了包含StartDate和EndDate的DateTime列表, 用戶應從此列表中選擇一個或多個TimeSpans。 他們也有一個結構類命名課程。檢查多個干擾日期時間

如何可以檢查是否有任何重疊的情況或未

例如我得到這個

Start Date End Date 
#1 7/20/2016 7/27/2016 Selected 
#2 6/18/2016 7/25/2016 Selected 
#3 7/20/2016 7/27/2016 
#4 6/5/2016  6/10/2016 

在本實施例用戶已經選擇了2個日期包含重疊。

我想告訴用戶一個消息框或一些使用C#

任何意見

感謝

+0

「含有干擾」是什麼意思?這裏有什麼「干擾」?目前你的問題還不是很清楚。你的意思是你想找到哪些間隔重疊?它看起來像用戶沒有選擇*日期*,但*日期範圍*在這裏...它看起來像我的前三個所有相互重疊... –

+0

我假設干擾意味着開始日期和結束日期兩選定的課程相互重疊。 – eds

+1

[確定是否兩個日期範圍重疊]可能的重複(http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) –

回答

1

好吧,首先創建一個類TIMEPERIOD這樣的:

public class TimePeriod 
{ 
    public int Id; 
    public DateTime FromDate 
    { 
     get; set; 
    } 

    public DateTime ToDate 
    { 
     get; set; 
    } 

    public static DateTime Parse(string date) 
    { 
     var dt = DateTime.Parse(date, 
     CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.RoundtripKind); 
     return dt; 
    } 
} 

然後創建一個列表與此類的項目:

List<TimePeriod> list = new List<TimePeriod>(); 

然後添加了日期的例子(添加了所有日期,只需添加所選日期):

list.Add(new TimePeriod() { Id = 1, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") }); 
list.Add(new TimePeriod() { Id = 2, FromDate = TimePeriod.Parse("6/18/2016"), ToDate = TimePeriod.Parse("7/25/2016") }); 
list.Add(new TimePeriod() { Id = 3, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") }); 
list.Add(new TimePeriod() { Id = 4, FromDate = TimePeriod.Parse("6/5/2016"), ToDate = TimePeriod.Parse("6/10/2016") }); 

而最後檢查與LINQ重疊:

var overlaps = from current in list 
       from compare in list 
       where 
       (
       (compare.FromDate > current.FromDate && 
       compare.FromDate < current.ToDate) || 
       (compare.ToDate > current.FromDate && 
       compare.ToDate < current.ToDate) 
       ) 
       select new 
       { 
        Id1 = current.Id, 
        Id2 = compare.Id, 
       }; 

其結果將是在這種情況下1/2 2/1 &和2/3 3/2 &。在你的情況下,它將是1/2 & 2/1。

+0

不錯,讓我檢查這個如果真的謝謝! –

1

你需要存儲哪些日期已被選擇,如果它們出現在多個選擇權?

商店startedate和每個選定的時間跨度的結束日期的元組selectedTimeSpans

則:

List<int> useddays =new List<int>(); 
foreach (Tuple<DateTime, DateTime> selected in selectedTimeSpans) 
{ 
    DateTime start = selected.Value1; 
    DateTime end = selected.Value2; 
    DateTime current = start; 
    while(current <=end) 
    { 
     if(useddays.Contains((current-DateTime.MinValue).TotalDays) 
      MessageBox. Show("Already used!"); 
     else 
      useddays.Add((current-DateTime.MinValue).TotalDays); 
     current.AddDays(1); 
    } 
} 
0

感謝所有@ c0d3b34n和@ThomasVoß,

而且這篇文章https://stackoverflow.com/a/325964/3970128

這是我所做的一切

好吧,首先創建一個類TimePeriod像這樣:

public class TimePeriod { public int Id; public DateTime FromDate { get;組; }

public DateTime ToDate 
{ 
    get; set; 
} 

public static DateTime Parse(string date) 
{ 
    var dt = DateTime.Parse(date, 
    CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.RoundtripKind); 
    return dt; 
} 

} 然後創建了這個類的項目的列表:

List<TimePeriod> list = new List<TimePeriod>(); 

然後添加你的日期的例子(加入所有的人,你只需要添加選定一個人的):

list.Add(new TimePeriod() { Id = 1, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") }); 
list.Add(new TimePeriod() { Id = 2, FromDate = TimePeriod.Parse("6/18/2016"), ToDate = TimePeriod.Parse("7/25/2016") }); 
list.Add(new TimePeriod() { Id = 3, FromDate = TimePeriod.Parse("7/20/2016"), ToDate = TimePeriod.Parse("7/27/2016") }); 
list.Add(new TimePeriod() { Id = 4, FromDate = TimePeriod.Parse("6/5/2016"), ToDate = TimePeriod.Parse("6/10/2016") }); 

然後

 foreach (var variable in list) 
     { 
      foreach (var VARIABLE in list) 
      { 
       if (variable.Id == VARIABLE.Id) 
       { 
        continue; 
       } 
       if ((variable.FromDate <= VARIABLE.ToDate) && (variable.ToDate >= VARIABLE.FromDate)) 
       { 
        Console.WriteLine("Problem Hapendes!! {0} <= {1} , {2} >= {3}", variable.FromDate.ToString(), VARIABLE.ToDate.ToString(), VARIABLE.ToDate.ToString(), VARIABLE.FromDate.ToString()); 
       } 
      } 
     }