我有一个包含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 :(得分: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:
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&amp; 2/1和2/3&amp; 3/2。在你的情况下,它将是1/2&amp; 2/1。
答案 1 :(得分:1)
答案 2 :(得分:1)
您需要存储哪些日期已被选中,以及它们是否出现在多个选项中?
将每个选定时间跨度的开始和结束存储到元组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);
}
}
答案 3 :(得分:0)
感谢所有@ c0d3b34n和@ThomasVoß,
另见本文https://stackoverflow.com/a/325964/3970128
这就是我所做的一切
好的,首先创建一个类TimePeriod,如下所示:
公共类TimePeriod { public int Id; public DateTime FromDate { 得到;组; }
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:
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());
}
}
}