C# 检查干扰的多个日期时间

C# 检查干扰的多个日期时间,c#,winforms,datetime,C#,Winforms,Datetime,我有一个DateTime的列表,包含StartDate和EndDate, 用户应从该列表中选择一个或多个时间跨度。 他们还有一个名为Courses的结构类 如何检查是否有重叠发生 例如,我得到了这个 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/201

我有一个DateTime的列表,包含StartDate和EndDate, 用户应从该列表中选择一个或多个时间跨度。 他们还有一个名为Courses的结构类

如何检查是否有重叠发生

例如,我得到了这个

    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
在此示例中,用户选择了两个包含重叠的日期

我想用一个消息框或一些使用C#的警告用户

有意见吗


谢谢

好的,首先创建一个类时间段,如下所示:

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<TimePeriod> list = new List<TimePeriod>();
最后与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,
                };
var overlaps=来自列表中的当前值
从比较列表
哪里
(
(比较.FromDate>当前.FromDate&&
compare.FromDatecurrent.FromDate&&
compare.ToDate

在这种情况下,结果将是1/2和2/1以及2/3和3/2。在您的情况下,它将是1/2和2/1。

好的,首先创建一个类时间段,如下所示:

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<TimePeriod> list = new List<TimePeriod>();
最后与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,
                };
var overlaps=来自列表中的当前值
从比较列表
哪里
(
(比较.FromDate>当前.FromDate&&
compare.FromDatecurrent.FromDate&&
compare.ToDate

在这种情况下,结果将是1/2和2/1以及2/3和3/2。在您的情况下,它将是1/2&2/1。

有一个非常好的库,用于处理nuget上的时间段及其交点

还有一篇关于它的代码项目的文章。

在nuget上有一个非常好的用于处理时间段及其交集的库

还有一篇关于它的代码项目的文章。

您需要存储已选择的日期,以及它们是否出现在多个选择中,对吗

将每个选定时间跨度的开始日期和结束日期存储到元组selectedTimeSpans

然后:

List useddays=new List();
foreach(在selectedTimeSpans中选择的元组)
{
DateTime start=selected.Value1;
DateTime end=selected.Value2;
日期时间当前=开始;

while(current您需要存储已选择的日期,以及它们是否出现在多个选择中,对吗

将每个选定时间跨度的开始日期和结束日期存储到元组selectedTimeSpans

然后:

List useddays=new List();
foreach(在selectedTimeSpans中选择的元组)
{
DateTime start=selected.Value1;
DateTime end=selected.Value2;
日期时间当前=开始;

而(当前多亏了所有@c0d3b34n和@ThomasVoß

也适用于本文

这就是我所做的一切


好的,首先创建一个类时间段,如下所示:

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;
    }
}
公共类时间段 { 公共int Id; 公共日期时间起始日期 { 获得;设置; }

} 然后创建了包含此类项目的列表:

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

foreach(列表中的var变量)
{
foreach(列表中的var变量)
{
if(variable.Id==variable.Id)
{
继续;
}
如果((variable.FromDate=variable.FromDate))
{
Console.WriteLine(“问题Hapendes!!{0}={3}”,variable.FromDate.ToString(),variable.ToDate.ToString(),variable.ToDate.ToString(),variable.FromDate.ToString());
}
}
}

感谢所有@c0d3b34n和@ThomasVoß

也适用于本文

这就是我所做的一切


好的,首先创建一个类时间段,如下所示:

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;
    }
}
公共类时间段 { 公共int Id; 公共日期时间起始日期 { 获得;设置; }

} 然后创建了包含此类项目的列表:

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

foreach(列表中的var变量)
{
foreach(列表中的var变量)
{
if(variable.Id==variable.Id)
{
继续;
}
如果((variable.FromDate=variable.FromDate))
{
Console.WriteLine(“问题Hapendes!!{0}={3}”,variable.FromDate.ToString(),variable.ToDate.ToString(),variable.ToDate.ToString(),variable.FromDate.ToString());
}
}
}

您所说的“包含干扰”是什么意思?什么是“干扰”这里?你的问题目前还不太清楚。你的意思是想找出哪些时间间隔重叠吗?看起来用户没有选择日期,但在这里选择了日期范围…在我看来,前三个时间间隔都相互重叠…我假设干扰意味着两个选定课程的开始日期和结束日期相互重叠。可能是d@AlekseyL的副本是的thanks@AlekseyL但是你能给我写一个循环来实现吗,我有一个数组和多个日期时间,所以…你说的“包含干扰”是什么意思?什么是“干扰”这里?你的问题目前还不太清楚。你的意思是想找出哪些时间间隔重叠吗?看起来用户没有选择日期,但在这里选择了日期范围…在我看来,前三个时间间隔都相互重叠…我假设干扰意味着两个选定课程的开始日期和结束日期相互重叠。可能是d@AlekseyL的副本是的thanks@AlekseyL但是你能给我写一个循环吗?我有一个Arr