0

基本上我有一个有效的从和有效到日期的报价。

例如: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;

虽然这不起作用,但有人可以帮我解决这个问题吗?

4

4 回答 4

0

在您决定开始日期和结束日期是包含还是不包含之后,检测重叠的常用方法是比较所考虑的两个范围的相反端。

您需要问“范围 1 是否在范围 2结束之前开始?”和“范围 2 是否在范围 1结束之前开始?”。如果这两个问题都得到了肯定的回答,那么你就有了重叠。

从您当前的代码中我不清楚结尾是包含还是排他,所以我不会尝试发布实际代码。

于 2012-04-23T12:10:17.250 回答
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;
于 2012-04-23T12:13:20.907 回答
0

不是直接回答您的问题,而是有机会谈论我最喜欢的库之一:TimePeriod for .NET。阅读这篇文章会给你一些关于如何处理你的情况的提示。

于 2012-04-23T12:15:32.600 回答
0

怎么样,使用linq

var overlaps=retailerCoupons.Any(c=> c.DateValidFrom <= ValidTo && c.DateExpires >= ValidFrom);

然后

result= !overlaps;
于 2012-04-23T12:16:02.803 回答