我有以下课程:
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)
因此,如果我理解正确 - 您想确保日期范围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)