2016-06-17 2 views
0

С учетом даты начала (DateTime), даты окончания (DateTime) и списка DayOfWeek (s). Как получить все даты соответствия:Получить даты с датой начала и окончания даты окончания дня

Пример:

StartDate : "06/17/2016" 
EndDate : "06/30/2016" 
DayOfWeek(s) : [0(Monday), 1(Tuesday), 4(Friday)] 

Требуемая результат:

Dates = ["06/17/2016", "06/20/2016", "06/21/2016", "06/24/2016", "06/27/2016", "06/28/2016"] 
+1

Что вы пробовали? Как просто перебирать даты и проверить, находится ли 'DayOfWeek' в вашем списке критериев? –

+0

Ваш список дат кажется немного неправильным ... Вам не хватает 2016-06-17, который является пятницей и вашей датой начала (должны ли они быть эксклюзивными?), И вы включаете 2016-06-29, который является средой. Хотя он и показывает, почему вам нужен этот код для его работы, возможно, стоит исправить это, чтобы избежать путаницы и упростить подтверждение того, что результаты ответов соответствуют правильным ожидаемым результатам. :) – Chris

ответ

2

Это вернет вам список всех дат между STARTDATE и EndDate, которые принадлежат данное перечисление дняОбщие сведения:

var allDays = Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d)); 
var Dates = allDays.Where(dt => dayOfWeek.Contains(dt.DayOfWeek)).ToList(); 
+0

Does 'Enum.IsDefined (dayOfWeek, dt.DayOfWeek)' делать то, что вы думаете, что он делает? первый аргумент - это тип перечисления, и он просто работает, если это значение действительно для перечисления (см. https://msdn.microsoft.com/en-us/library/system.enum.isdefined(v=vs. 110) .aspx). Я думаю, вы просто хотите что-то вроде 'inputDaysOfWeek.Contains (dt.DayOfWeek)'. где 'inputDaysOfWeek'' 'IEnumerable ' – Chris

+0

Нужно написать typeOf, и теперь он работает. Спасибо, что указал на Криса. И я принимаю 'dayOfWeek (s): [0 (понедельник), 1 (вторник), 4 (пятница)]' является перечислением. Если это всего лишь список или коллекция, то я согласен, что это должно быть 'daysOfWeek.Contains (dt.DayOfWeek)'. Я сначала ответил, что только, но позже изменил код в вопросе выше. :) –

+0

Я не уверен, что понимаю, что вы говорите. Вы предлагаете, чтобы OP определял новое перечисление, вставляя нужные значения и затем проверяя, что новое перечисление для того, содержит ли оно соответствующее значение из другого перечисления? Если это звучит как ужасная идея! – Chris

1

еще одно возможное решение, я думаю, что это просто понимать и отлаживать, даже если это стоит больше линий и, возможно, немного больше ресурсов, чем другие возможные решения:

var startDate = new DateTime(2016, 06, 17); 
    var endDate = new DateTime(2016, 06, 30); 

    DayOfWeek[] daysOfWeek = { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Friday }; 

    List<DateTime> dates = new List<DateTime>(); 
    if (endDate >= startDate) 
    { 
     var tmp = startDate; 
     tmp = tmp.AddDays(1); //I notice you didn't add 06/17/2016 that is friday, if you want to add it, just remove this line 
     do 
     { 
      if (daysOfWeek.Contains(tmp.DayOfWeek)) 
       dates.Add(tmp); 
      tmp = tmp.AddDays(1); 
     } 
     while (tmp <= endDate); //If you don't want to consider endDate just change this line into while (tmp < endDate); 
    } 
Смежные вопросы