使用LINQ查找范围内的范围

时间:2012-08-24 04:33:13

标签: c# linq linq-to-entities

我有一个日期清单

StartDate EndDate

1-Nov-2011         31-Jan-2012   
3-Mar-2012          1-Apr-2012  
1-May-2012         31-Dec-2012 
1-Jan-2013          1-Dec-2013

获取属于此范围的所有记录

1-Jan-2012          31-Dec-2012

答案是上面列表中的前三个记录

我怎么能用Linq做到这一点。

由于

2 个答案:

答案 0 :(得分:3)

这应该有效:

var rangeStart = new DateTime(2012, 1, 1);
var rangeEnd = new DateTime(2012, 12, 31);
var res = list
    .Where(item => (item.StartTime < rangeStart ? rangeStart : item.StartTime) < (item.EndTime < rangeEnd ? item.EndTime : rangeEnd) )
    .ToList();

条件是“两个左端中的较大者需要小于两个右端中的较小者”。

答案 1 :(得分:2)

我建议以下包装

public struct DateInterval
    {
        public DateTime StartDate { get; set; }

        public DateTime EndDate { get; set; }

        public bool HasIntersection(DateInterval secondInterval)
        {
            return HasIntersection(this.StartDate, this.EndDate,secondInterval.StartDate,secondInterval.EndDate);
        }
        private bool HasIntersection(DateTime dateStart1, DateTime dateEnd1, DateTime dateStart2, DateTime dateEnd2)
        {
            if (dateEnd1 < dateStart2) return false; 
            if (dateEnd2 < dateStart1) return false; 
            return true;
        }
    }

用法:

        var targetInterval = new DateInterval() {StartDate = new DateTime(2012, 1, 1), EndDate = new DateTime(2012, 1, 1)};
        var listOfIntervals =GetIntervals();//retrieve data
        var filteredList = listOfIntervals.Where(targetInterval.HasIntersection).ToList();