0

基本的に、有効な日付と有効な日付を持つオファーがあります。

例: 2012 年 1 月 2 日から 2012 年 2 月 3 日

新しいオファーを追加するときは、このオファーが上記の既存のオファーに含まれたり重複したりしないように有効にする必要があります。

これに対する私の現在のコードは以下のとおりです。

// 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

開始日と終了日が包括的か排他的かを決定した後、重複を検出する通常の方法は、検討中の2つの範囲の両端を比較することです。

「範囲1は範囲2が終了する前に開始しますか?」、および「範囲2は範囲1が終了する前に開始しますか?」と尋ねる必要があります。これらの質問の両方が肯定的に答えられた場合、あなたは重複しています。

現在のコードから、両端が包括的であるか排他的であるかが明確ではないため、実際のコードを投稿しようとはしません。

于 2012-04-23T12:10:17.250 に答える
0

retailerCoupons1) nullになることはできないと思います。

2)はるかに読みやすいDateTime.Compare(t1, t2) < 0書き込み可能な場合を使用するのはなぜですか?t1 <= t2

3) 2 つの間隔が重なっていないかどうかをテストする場合は、次をテストします。

bool they_do_not_overlap = t1_end <= t2_start || t1_start >= t2_end;
于 2012-04-23T12:13:20.907 に答える
0

あなたの質問に対する直接的な回答ではありませんが、私のお気に入りのライブラリの 1 つである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 に答える