检查一个日期范围是否在一个日期范围内我有以下类:放;公共日期时间?结束日期{得到;放;}//如果为null,则它会永远持续}我需要确保新项目在添加到以下列表时不会与现有项目的日期重叠:varmembership=newList{newMembership{StartDate=DateTime.UtcNow.AddDays(-10),EndDate=DateTime.UtcNow.AddDays(-5)},newMembership{StartDate=DateTime.UtcNow.AddDays(-5),EndDate=null}};例如:varnewItem=newMembership{StartDate=DateTime.UtcNow。AddDays(-15),EndDate=DateTime.UtcNow.AddDays(-10)};//允许varnewItem2=newMembership{StartDate=DateTime.UtcNow.AddDays(-15),EndDate=null};//不允许if(AllowededToAdd(newItem))membership.Add(newItem);如果(AllowededToAdd(newItem2))membership.Add(newItem2);我认为这很简单,但到目前为止我的尝试都是错误的,我开始感到困惑,希望有人做过类似的事情。谢谢基本上,如果日期范围的任何一端在另一个范围内,则日期范围会与另一个重叠,反之亦然。staticboolAllowedToAdd(ListmembershipList,MembershipnewItem){return!membershipList.Any(m=>(m.StartDate如何使用:if(AllowedToAdd(membershipList,newItem))membershipList.Add(newItem);所以如果我理解正确-您要确保日期范围2不在日期范围1中吗?示例:startDate1=01/01/2011endDate1=01/02/2011和startDate2=19/01/2011endDate2=10/02/2011这应该是一个简单的示例:if((startDate2>=startDate1&&startDate2=startDate1&&endDate2这是一个使用Collection的解决方案(缺少空参数验证,并在Membership中验证EndDate>StartDate):publicclassMembership{publicDateTimeStartDate{get;set;}}//如果为null,那么它将永远持续下去return!IsFullyAfter(other)&&!other.IsFullyAfter(this);}}公共类MembershipCollection:Collection{protectedoverridevoidInsertItem(intindex,Membershipmember){if(CanAdd(member))base.InsertItem(index,member);elsethrownewArgumentException("范围不能重叠。");}publicboolCanAdd(Membershipmember){return!this.Any(member.Overlaps);像这样的条件应该可以解决问题:newItem.StartDate=range.StartDate有点晚了,但我在答案/评论的任何地方都找不到这个模式if(startDate1如果你没有不同的排序标准,首先维护列表中的顺序。由于不允许以前添加的对象重叠,一旦知道将添加新对象的点,您只需要比较两侧的各个对象以确保允许添加新对象。您还需要考虑“较早”对象的结束日期是否与“较晚”对象的开始日期重叠,因为这种排序使得重叠的另一种可能性变得无关紧要。因此,除了简化检测重叠问题之外,我们还可以将复杂度从O(n)降低到O(logn),而不是与所有现有项目进行比较,我们通过比较我们找到的0-2O(logn)来搜索。私有类MembershipComparer:IComparer{publicintCompare(Membershipx,Membershipy){returnx.StartDate.CompareTo(y.StartDate);}}privatestaticboolAddMembership(Listlst,Membershipms){intbsr=lst.BinarySearch(ms,newMembershipComparer());if(bsr>=0)//现有对象具有完全相同的StartDate,因此重叠//(您可能想也可能不想考虑零秒日期范围的情况)returnfalse;intidx=~bsr;//如果不匹配则要插入的索引。if(idx!=0){成员资格prev=lst[idx-1];//如果允许包含范围(上一个结束与下一个开始完全相同//将此行更改为://if(!prev.EndDate.HasValue||prev.EndDate>ms.StartDate)if(prev.EndDate??DateTime.MaxValue>=ms.StartDate)returnfalse;}if(idx!=lst.Count){Membershipnext=lst[idx];//如果允许包含范围,则更改为://if(!ms.EndDate.HasValue||ms.EndDate>next.StartDate)if(ms.EndDate??DateTime.MaxValue>=next.StartDate)返回false;}lst.Insert(idx,ms);返回真;}无法添加到列表返回false如果抛出异常更合适,这是一个简单的修改。以上就是C#学习教程:检查日期范围是否在日期范围内。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注---try{//获取与零售商关联的当前优惠券列表。列出retailerCoupons=PayPalInStore.Data.RetailerCoupon.Find(x=>x.RetailerId==RetailerId).ToList();//遍历每张优惠券,看看新优惠券中提供的时间范围是否不在任何EZISTING优惠券之间。if(retailerCoupons!=null){foreach(retailerCoupons中的RetailerCoupon优惠券){DateTimeretailerCouponValidFrom=Timecoupon.Date=coupon.DateExpires;如果((ValidFrom=retailerCouponValidTo&&ValidTo>=retailerCouponValidTo)){returnfalse;}}}返回结果;}catch(Exceptionex){this.errorManager.LogError("DoesAnOfferAlreadyExistWithinTheTimeframe"nProvidedfail)结果;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
