C# 查找和确定日期相交的算法

C# 查找和确定日期相交的算法,c#,algorithm,date,C#,Algorithm,Date,我有一个包含日期范围的对象 public class MyObject { public int Id {get; set;} public string Name {get; set;} public DateTime StartDate {get; set;} public DateTime EndDate {get; set;} } 我希望能够传入MyObject的一个实例,并检查以确保所有其他具有相交日期的对象,例如 va

我有一个包含日期范围的对象

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)
                { }
            }
  }
var myObj=新的MyObject
{
Id=1,
Name=“Test”,
起始日期=新日期(2017年3月1日),
EndDate=新日期(2017年3月10日)
};
foreach(对象列表中的变量对象列表)
{
bool done=false;
//如果两个日期都在rnage内

如果(objInList.StartDate检查日期范围相交的代码如下:

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);
MyObject a=。。。
MyObject b=。。。
DateTime maxStart=a.StartDate>b.StartDate?a.StartDate:b.StartDate;
DateTime minEnd=a.EndDate
我希望我能帮助您:

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
            }
        }
    }
private bool istimetween(日期时间-时间、日期时间-开始时间、日期时间-结束时间)
{
如果(时间>=startTime&&theTime=objInList.EndDate)
继续;
if(istimetween(objInList.StartDate、myObj.StartDate、myObj.EndDate)
||istimetween(objInList.EndDate、myObj.StartDate、myObj.EndDate))
{
//交叉
}
if(objInList.StartDatemyObj.EndDate)
{
//交叉
}
}
}

这里的
日期类型是什么?这是您自己的类型吗?如果您提供正确缩进的代码和示例输入/预期输出,这将非常有帮助-我发现很难理解您试图在这里实现什么。很抱歉,这是.Net DateTime。我更新了示例。我想检查myObj的日期是否与objList中的ny日期范围。这有意义吗?有点不错,但与其说是“日期”,不如说是“日期范围”。我建议您首先要做的是创建一个
DateRange
类型,您可以将大部分逻辑放在其中。(您显示的格式错误的代码只设置了
已完成
,这没有任何帮助-它没有做任何其他事情。)再说一次,a会更有用。对不起,这是一个日期时间。我更关心的是更新交叉点发生的obj的日期。这会使sense@IsaacLevin清除交叉路口完全取决于你。想出一个策略,在检测到重叠后你该怎么做。可能性是无穷的,所以你需要选择one策略。你需要决定当区间简单相交时该怎么做(拉入终点/向前拉起点、选择中间点等),而不是当一个区间包含另一个完整的区间时该怎么做(放下两个对象中的一个?创建两个额外的对象来表示切割?)