2016-04-26 45 views
1
  1. 请耐心等待阅读问题,因为我发现这个问题有点难以解释。
  2. 请提出一个更好的标题,以便它可以帮助社区中的其他人。

我有3个领域。即地址类型的生效日期和到期日期

  1. 地址类型 - 下拉(值: '结算', '公司')
  2. 生效日期 - 日期选择器(毫米/日/年),强制性
  3. 过期日期 - 日期选择器(毫米/日/年),不是强制性的

我需要应用以下验证: 不能有两个地址在同一时间同一类型的主动。

请参考下面的屏幕截图作为例子。

enter image description here

现在,我有2列表(日期时间)即。 addressesEffectiveDatesList,addresses在C#中的ExpirationDatesList。我没有得到如何实现这一目标的线索。

+0

你有效的地址日期为了 – SadiRubaiyet

回答

2

我创建了一个捣鼓你here

我会建议你做客户端验证也是如此。 我假设你的日期列表是为了,所以第i个开始和结束日期的元素将代表第i个区间,因此只要日期是订单东西的

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

+0

嘿@SadiRubaiyet,谢谢你的小提琴。 到期日期不是强制性的。所以,你写的第一个场景是一个有效的场景。如果过期日期为空,并且如果存在第二个生效日期,则程序应返回'不能有2个活动帐单地址',因为对于第一个范围,过期日期为空,这意味着第一个范围永远不会过期。所以用户不应该添加另一个日期范围。希望我能解释一下 – mathewtinuthomas

+0

是的,你可以实现一些客户端逻辑,这将允许你轻松地做到这一点。如果答案帮助你,请将其标记为已接受或有帮助,很乐意帮助 – SadiRubaiyet

+0

答案肯定有帮助,但你能不能更新与上述案例的小提琴。 – mathewtinuthomas

1

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

基本上,

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

你还可以用<> =在C#中比较datetime对象=和。

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

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