Linq单个集合中的重叠日期范围检查

时间:2018-07-06 07:31:19

标签: c# linq

Class TimeRange{
  private DateTime StartDate{get; set;}
  private DateTime EndDate{get; set;}
}

List<TimeRange> TimeRangeList = new List<TimeRange>(){
  new TimeRange(){StartDate = new DateTime(2050, 1, 1), 
                    EndDate = new DateTime(2050, 1, 10)},
  new TimeRange(){StartDate = new DateTime(2050, 2, 1), 
                    EndDate = new DateTime(2050, 2, 10)},
  //This item will triggered the overlap validation failed
  new TimeRange(){StartDate = new DateTime(2050, 1, 5),
                    EndDate = new DateTime(2050, 1, 9)},
                              },
}

因此,我签出similar topic之后,仍然找不到弄清楚重叠日期范围的算法。

根据Checking for date overlap across multiple date range objects

,这在SQL中非常简单

我只需要比较两个日期范围

SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
AND Table1.EndDate > 'startCheckDate'

我发现在Linq中很难做到,我们如何比较其中一个馆藏中的所有物品?原因是我们可以像比较两个列表一样在循环中使用foreach,但是在select中如何工作?

实际上我在做这样的事情

for (int i = 0; i < TimeRangeList .Count(); ++i)
{
        var item = TimeRangeList[i];                    
        for (int y = i + 1; y < TimeRangeList.Count(); ++y)
        {
                var item2 = TimeRangeList[y];

                if (IsOverLapped(item, item2))
                {
                    // this is overlapped
                };
        }
}

private bool IsOverLapped(dynamic firstObj, dynamic secondObj)
{
        return secondObj.StartDate <= firstObj.EndDate && firstObj.StartDate <= secondObj.EndDate;
}

还有没有循环的更优雅的方法吗?

所以我的问题是,我们如何通过linq比较每个项目本身的一个列表?

2 个答案:

答案 0 :(得分:2)

一个简单的蛮力想法:

bool overlap = TimeRangeList
    .Any(r => TimeRangeList
         .Where(q => q != r)             
         .Any(q => q.EndDate >= r.StartDate && q.StartDate <= r.EndDate) );

答案 1 :(得分:0)

如果我看一下您的SQLcode,看来您有一个Table1对象,它是一系列相似的对象,比方说Table1Row类。每个Table1Row至少具有两个DateTime属性,一个StartDate和一个EndDate。此外,您有两个DateTime对象:startCheckDateendCheckDate

您要计算Table1中小于StartDate的{​​{1}}和大于startCheckDate的{​​{1}}的所有元素

写为IQueryable的扩展功能:

EndDate

用法:

endCheckDate

简单的漫画吧?