C# 生效日期及;地址类型的过期日期 请耐心阅读问题,因为我发现这一点有点难以解释 请建议一个更好的标题,以便帮助社区中的其他人

C# 生效日期及;地址类型的过期日期 请耐心阅读问题,因为我发现这一点有点难以解释 请建议一个更好的标题,以便帮助社区中的其他人,c#,asp.net,ienumerable,C#,Asp.net,Ienumerable,我有3个字段。即 地址类型-下拉列表(值:“账单”、“公司”) 生效日期-日期选择器(mm/dd/yyyy),必填 到期日期-日期选择器(mm/dd/yyyy),非强制性 我需要应用以下验证: 同一类型的两个地址不能同时处于活动状态。 请参考下面的屏幕截图以获取示例 现在,我有两个列表(日期时间),即。addressesEffectiveDatesList,addressesExpirationDatesList在C#中。我不知道如何做到这一点。您需要检查日期范围是否重叠。这里有一个很好的答案

我有3个字段。即

  • 地址类型-下拉列表(值:“账单”、“公司”)
  • 生效日期-日期选择器(mm/dd/yyyy),必填
  • 到期日期-日期选择器(mm/dd/yyyy),非强制性
  • 我需要应用以下验证: 同一类型的两个地址不能同时处于活动状态。

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


    现在,我有两个列表(日期时间),即。addressesEffectiveDatesList,addressesExpirationDatesList在C#中。我不知道如何做到这一点。

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

    基本上

    (StartA <= EndB) and (EndA >= StartB)
    
    (StartA=StartB)
    
    您可以将DateTime对象与C#中的=进行比较

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


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

    我为您创建了一个提琴

    我建议您也进行客户端验证。 我假设您的日期列表是有序的,所以开始日期和结束日期的第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.";
                    }
                }
    
    //检查以确保所有生效日期都有结束日期,最后一个除外。
    对于(变量i=1;ieffectiveStartDates[i])
    {
    结果=“不能有2个活动帐单地址。”;
    }
    }
    
    只要日期符合顺序(如生效日期),就可以这样做。希望这有帮助


    更新:我已经更新了小提琴,以确保没有与无限范围重叠。[检查这个]()

    你有有效的地址日期吗hey@sadirubayet,谢谢你的帮忙。到期日期不是强制性的。因此,您编写的第一个场景是一个有效的场景。如果过期日期为空,并且存在第二个生效日期,则程序应返回“不能有2个活动的账单地址”,因为对于第一个范围,过期日期为空,这意味着第一个范围将永远不会过期。所以用户不能再添加一个日期范围。希望我能解释是的,您也可以实现一些客户端逻辑,这将使您能够轻松地做到这一点。如果答案有助于您,请将其标记为“已接受”或“有帮助”,很高兴为您提供帮助答案肯定有帮助,但请您更新上述案例的提琴。让我再解释一遍。就我而言,“截止日期”不是强制性的。例如,范围-1从-2015年1月13日至-1从-2015年1月2日至-2015年2月20日,因此,在上述示例中,“范围-1至”为空,这是允许的。它只是意味着“范围-1到”是无限的。所以“范围2”重叠。你能帮我改变逻辑以适应我的情况吗?更新了我的答案,但我建议你从客户端确保范围是有序的,这样他们只有在指定结束日期后才能输入另一个范围,这样它才是一致的,你就不会来回验证了