生效日期&地址类型的到期日期

时间:2016-04-26 01:15:57

标签: c# asp.net ienumerable

  
      
  1. 在阅读问题时请耐心等待,因为我发现这个问题有点难以解释。
  2.   
  3. 请建议一个更好的标题,以便它可以帮助社区中的其他人。
  4.   

我有3个字段。即

  1. 地址类型 - 下拉列表(值:'结算','公司')
  2. 生效日期 - Datepicker(mm / dd / yyyy),强制性
  3. 到期日期 - Datepicker(mm / dd / yyyy),非强制性
  4. 我需要应用以下验证: 不能同时激活两个同一类型的地址。

    请参阅下面的屏幕截图以获取示例。

    enter image description here

    现在,我有2个列表(DateTime)即。在C#中的addressesEffectiveDatesList,addressesExpirationDatesList。我不知道如何实现这一目标。

2 个答案:

答案 0 :(得分:2)

我为你创造了一个小提琴here

我建议您也进行客户端验证。 我假设你的日期列表是有序的,所以开始和结束日期的第i个元素将代表ith间隔,所以

中的某些内容
           //Checking to make sure all effective dates have end date, except the last one.
            for (var i = 1; i < effectiveEndDates.Count; i++)
            {
                if (!effectiveEndDates[i - 1].HasValue)
                {
                    result = "cannot have a previous billing address without and end date.";
                }
            }

            //Ensure all the startDates Dates are on or after the next end Date
            //This solution will work if the effective dates are in order.
            for (var i = 1; i < effectiveStartDates.Count; i++)
            {
                var effectiveEndDate = effectiveEndDates[i - 1];
                if (effectiveEndDate != null && effectiveEndDate.Value > effectiveStartDates[i])
                {
                    result = "cannot have 2 active billing address.";
                }
            }
只要日期在订单中(如生效日期),

就可以完成。希望这有帮助

更新:我更新了小提琴以确保没有任何重叠与无限范围。 [检查](https://dotnetfiddle.net/nmyA3P

答案 1 :(得分:1)

您需要检查日期范围是否重叠。这里有一个很好的答案:Determine Whether Two Date Ranges Overlap

基本上,

(StartA <= EndB) and (EndA >= StartB)

您可以在C#中将DateTime对象与&lt; =和&gt; =进行比较。

正如SadiRubaiyet在评论中提到的那样,如果你按开始日期排序每个人的地址会使事情变得更快,因为这意味着你只需要将每个日期范围与下一个日期范围进行比较。

如果没有订购,则必须将每个日期范围与该人的每个其他地址进行比较。