检查日期范围是否在日期范围内

nfp*_*lee 10 c#

我有以下课程:

public class Membership
{
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; } // If null then it lasts forever
}
Run Code Online (Sandbox Code Playgroud)

我需要确保在添加到以下列表时新项目与现有项目的日期不重叠:

var membership = new List<Membership>
{
    new Membership { StartDate = DateTime.UtcNow.AddDays(-10), EndDate = DateTime.UtcNow.AddDays(-5) },
    new Membership { StartDate = DateTime.UtcNow.AddDays(-5), EndDate = null }
};
Run Code Online (Sandbox Code Playgroud)

例如:

var newItem = new Membership { StartDate = DateTime.UtcNow.AddDays(-15), EndDate = DateTime.UtcNow.AddDays(-10) }; // Allowed

var newItem2 = new Membership { StartDate = DateTime.UtcNow.AddDays(-15), EndDate = null }; // Not Allowed

if (AllowededToAdd(newItem))
    membership.Add(newItem);

if (AllowededToAdd(newItem2))
    membership.Add(newItem2);
Run Code Online (Sandbox Code Playgroud)

我认为这很简单,但到目前为止,我的尝试都是错误的,我开始迷惑自己,并希望有人做了类似他们可以分享的事情.谢谢

Dan*_*tru 15

基本上,如果日期范围的任何结尾都在另一个范围内,则日期范围会重叠,反之亦然.

static bool AllowedToAdd(List<Membership> membershipList, Membership newItem)
{
    return !membershipList.Any(m =>
        (m.StartDate < newItem.StartDate &&
         newItem.StartDate < (m.EndDate ?? DateTime.MaxValue))
        ||
        (m.StartDate < (newItem.EndDate ?? DateTime.MaxValue) &&
         (newItem.EndDate ?? DateTime.MaxValue) <= (m.EndDate ?? DateTime.MaxValue))
        ||
        (newItem.StartDate < m.StartDate &&
         m.StartDate < (newItem.EndDate ?? DateTime.MaxValue))
        ||
        (newItem.StartDate < (m.EndDate ?? DateTime.MaxValue) &&
         (m.EndDate ?? DateTime.MaxValue) <= (newItem.EndDate ?? DateTime.MaxValue))
        );
}
Run Code Online (Sandbox Code Playgroud)

用法:

if (AllowedToAdd(membershipList, newItem))
    membershipList.Add(newItem);
Run Code Online (Sandbox Code Playgroud)


jim*_*ode 5

因此,如果我理解正确 - 您想确保日期范围2不在日期范围1内吗?

例如:

startDate1 = 01/01/2011

endDate1 = 01/02/2011
Run Code Online (Sandbox Code Playgroud)

startDate2 = 19/01/2011

endDate2 = 10/02/2011
Run Code Online (Sandbox Code Playgroud)

这应该是一个简单的例子:

if ((startDate2 >= startDate1 &&  startDate2 <= endDate1) || 
    (endDate2   >= startDate1 && endDate2   <= endDate1))
Run Code Online (Sandbox Code Playgroud)