Member 1283347 Ответов: 1

Получите начальную и конечную дату каждой недели из диапазона конечных дат серии linq


У меня есть приложение, в котором пользователь будет вводить данные StartDate, EndDate и SeriesEndDate. Пример:
StartDate= 02/12/2019
EndDate = 03/16/2019
SeriesEndDate= 12/31/2025

Я хочу получить дату начала и окончания каждой недели в результирующем наборе для всего периода в пределах SeriesEndDate Но я хочу, чтобы эти недели приходились на SeriesEndDate

Что я уже пробовал:

Я использую приведенный ниже код, но мне нужно, чтобы серия попадала в дату окончания серии
var dating22 = (from d in dates
           where d.DayOfWeek == DayOfWeek.Monday
           select new 
           { 
             StartWeekDate = d.DayOfWeek != DayOfWeek.Monday ? d.Date.PreviousOfWeek(DayOfWeek.Monday) : d.Date, 
             EndWeekDate = d.NextDayOfWeek(DayOfWeek.Sunday) 
           }).Distinct();

Richard MacCutchan

Почему SeriesEndDate не находится между значениями StartDate и EndDate? А каково содержание переменной dates в вашем выражении LINQ?

1 Ответов

Рейтинг:
12

Maciej Los

Ты имеешь в виду что-то вроде этого?

//define helper class
public class WeekStartEnd
{
    public DateTime Monday;
    public DateTime Sunday;
}

//usage:
DateTime StartDate = DateTime.Parse("02/12/2019");
DateTime EndDate = DateTime.Parse("03/16/2019");
DateTime SeriesEndDate= DateTime.Parse("12/31/2025");
//find first monday
DateTime firstMonday =  Enumerable.Range(0, 7)
    .SkipWhile(x => StartDate.AddDays(x).DayOfWeek != DayOfWeek.Monday)
    .Select(x => StartDate.AddDays(x))
    .First();
//get count of days
TimeSpan ts = (TimeSpan)(SeriesEndDate - firstMonday);
//create new list of WeekStartEnd class
List<WeekStartEnd> dates = new List<WeekStartEnd>();
//add dates to list
for(int i=0; i<ts.Days; i+=7)
{
        //if(firstMonday.AddDays(i+6)<SeriesEndDate) //uncomment this line if you would like to get last sunday before SeriesEndDate
    dates.Add(new WeekStartEnd(){Monday=firstMonday.AddDays(i), Sunday=firstMonday.AddDays(i+6)});
}


Результат:
Monday              Sunday
2019-02-18 00:00:00 2019-02-24 00:00:00 
2019-02-25 00:00:00 2019-03-03 00:00:00 
2019-03-04 00:00:00 2019-03-10 00:00:00 
...  
2025-12-22 00:00:00 2025-12-28 00:00:00 
2025-12-29 00:00:00 2026-01-04 00:00:00 


[РЕДАКТИРОВАТЬ]

Только с помощью методов Linq:

int w = ts.Days / 7;

List<WeekStartEnd> dates = Enumerable.Range(0,w)
    .Select(x=> new WeekStartEnd(){Monday=firstMonday.AddDays(x*7), Sunday=firstMonday.AddDays(x*7+6)})
    .ToList();