基本上我有一个有效且有效的报价。
例如:01/02/2012至03/02/2012
当我添加新优惠时,我需要有效确保此优惠不属于上述现有优惠或与之重叠。
我目前的代码如下:
// Obtain the current list of coupons associated to the retailer.
List<RetailerCoupon> retailerCoupons = PayPalInStore.Data.RetailerCoupon.Find(x => x.RetailerId == RetailerId).ToList();
// Loop through each coupon and see if the timeframe provided in the NEW coupon doesnt fall between any EZISTING coupon.
if (retailerCoupons != null)
{
foreach (RetailerCoupon coupon in retailerCoupons)
{
DateTime retailerCouponValidFrom = coupon.DateValidFrom;
DateTime retailerCouponValidTo = coupon.DateExpires;
if (DateTime.Compare(retailerCouponValidFrom, ValidFrom) < 0 && DateTime.Compare(retailerCouponValidTo, ValidTo) > 0)
{
return true;
}
if (retailerCouponValidFrom == ValidFrom && retailerCouponValidTo == ValidTo.AddHours(23).AddMinutes(59).AddSeconds(59))
{
return true;
}
}
}
return result;
虽然这不起作用,但有人可以帮我这个吗?
答案 0 :(得分:0)
在您确定开始日期和结束日期是包含还是排除之后,检测重叠的常用方法是比较正在考虑的两个范围的相反的端。
您需要在范围2 结束之前询问“范围1 开始吗?”和“范围1 <范围2 开始 <范围1 < EM>端?”。如果这两个问题都得到肯定回答,那么你就会有重叠。
我目前的代码中并不清楚结尾是包含还是排他,所以我不会尝试发布实际代码。
答案 1 :(得分:0)
1)我认为retailerCoupons
不能为空。
2)为什么使用DateTime.Compare(t1, t2) < 0
时可以编写更易读的t1 <= t2
?
3)如果要测试两个间隔是否重叠,请测试以下内容:
bool they_do_not_overlap = t1_end <= t2_start || t1_start >= t2_end;
答案 2 :(得分:0)
不能直接回答您的问题,但有机会谈论我最喜欢的一个库:TimePeriod for .NET。阅读这篇文章会给你一些关于如何处理你的情况的提示。
答案 3 :(得分:0)
怎么样,使用linq
var overlaps=retailerCoupons.Any(c=> c.DateValidFrom <= ValidTo && c.DateExpires >= ValidFrom);
然后
result= !overlaps;