C# 如何从fromdate&;列表中获取日期范围;todate与另一个日期进行比较

C# 如何从fromdate&;列表中获取日期范围;todate与另一个日期进行比较,c#,validation,datetime,C#,Validation,Datetime,我收集了如下日期 var dateList = new List<DatePrev> { new DatePrev{ FromDate=new DateTime(2014,10,1), ToDate=new DateTime(2015,3,1)}, new DatePrev{ FromDate=new DateTime(2013,2,1), ToDate=new DateTime(2013,10,1)}, new DatePrev{ FromDate=new

我收集了如下日期

var dateList = new List<DatePrev>
{
    new DatePrev{ FromDate=new DateTime(2014,10,1), ToDate=new DateTime(2015,3,1)},
    new DatePrev{ FromDate=new DateTime(2013,2,1), ToDate=new DateTime(2013,10,1)},
    new DatePrev{ FromDate=new DateTime(2010,2,1), ToDate=new DateTime(2011,10,1)}
};
var newDate = new DatePrev { FromDate = new DateTime(2015, 2, 1), ToDate = new DateTime(2017, 5, 1) };
我想在dateList集合中搜索,以确定提供的newdate是否可以插入具有适当日期范围的dateList中。
由于提供的日期列表的起始日期早于日期列表第一行的截止日期,因此不应允许插入。

如果仅当已添加的日期范围与新的日期范围不重叠时,才需要向现有列表添加
newDate
,则可以执行以下操作:

 bool slotTaken = dateList.Any(x => (x.FromDate <= newDate.FromDate &&
                                     x.ToDate >= newDate.FromDate) ||
                                    (x.x.FromDate <= newDate.ToDate &&
                                     x.ToDate >= newDate.ToDate);

 if (!slotTaken) 
 {
     dateList.Add(newDate);
 }
bool slotTaken=dateList.Any(x=>(x.FromDate=newDate.FromDate)||
(x.x.FromDate=newDate.ToDate);
如果(!slotTaken)
{
dateList.Add(newDate);
}

请注意,比较条件可能会根据您对范围结束时间相等的情况的要求而变化。如果
newDate.FromDate
newDate.ToDate
与存储的日期相等,则当前解决方案会拒绝新的间隔。根据您的示例,这意味着
new DatePrev{FromDate=new DateTime(2015,3,1),ToDate=new DateTime(2017,5,1)};
将被拒绝。如果允许相同的日期,您只需在比较中删除
=
,但您需要考虑两个结束日期相同的特殊情况(即,日期范围已经被添加).

如果我正确理解了你的问题,你要寻找的是一种检查两个“日期跨度”是否重叠的方法

一、 我自己,最近有这样一个问题,解决起来相当容易

给定两个日期,定义为:

  • 日期A带有
    Astart
    Aend
  • 日期B带有
    B开始
    弯曲
在以下情况下,您可以确定它们是否重叠:
!(AendBend)

因此,您可以编写以下代码:

class DatePrev
{
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }

    public static bool Overlap(DatePrev dateA, DatePrev dateB)
    {
        return !(dateA.ToDate < dateB.FromDate || dateA.FromDate > dateB.ToDate);
    }
}

(...)

        var newDate = new DatePrev(); //specify from and to

        if (!dateList.Any(d => DatePrev.Overlap(d, newDate)))
            dateList.Add(newDate);
class-DatePrev
{
公共日期时间FromDate{get;set;}
公共日期时间ToDate{get;set;}
公共静态布尔重叠(DatePrev dateA、DatePrev dateB)
{
返回!(dateA.ToDatedateB.ToDate);
}
}
(...)
var newDate=new DatePrev();//指定从和到
如果(!dateList.Any(d=>DatePrev.Overlap(d,newDate)))
dateList.Add(newDate);

代码假定
DatePrev
包含“正常”值,即
ToDate>FromDate
。此外,您可能需要根据从/结束日期是包含日期还是独占日期来调整条件(必要时将
<或>
更改为
).

我不太清楚您在问什么。是否仅当新的日期范围不与任何现有范围重叠时才添加新的日期范围?是的。很抱歉,这是一个完整的问题。