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

答えは、上記のリストの最初の 3 つのレコードになります。

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

条件は、「2 つの左端のうち大きい方が、2 つの右端のうち小さい方よりも小さい必要がある」です。

于 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 に答える