2

我有一个日期列表

开始日期 结束日期

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 做到这一点。

谢谢

4

2 回答 2

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();

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

于 2012-08-24T05:06:28.593 回答
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();
于 2012-08-24T04:58:39.807 回答