Как получить все выходные в диапазоне дат в C #

1

Мне просто интересно, есть ли простой способ или рамки для получения всех выходных дней в диапазоне дат в С#?

Возможно ли это с LINQ?

Любая подсказка?

Спасибо!

  • 3
    Я предполагаю, что это не слишком просто, но это должно быть возможно (в том числе с LINQ). Удачи!
  • 2
    Супермен, теперь ты должен знать, что ответ «возможно <x> возможно» почти всегда «да». Я подозреваю, что вы хотите, чтобы кто-то показал вам, как. Вы должны задать этот вопрос вместо этого, если это то, что вы ищете.
Теги:
date-range
dayofweek

3 ответа

1
Лучший ответ

Я нашел, как это сделать.

http://www.dotnetjalps.com/2011/06/finding-saturdaysunday-between-date.html

namespace DatimeApplication
{
   class Program
   {
       static void Main(string[] args)
       {
             DateTime startDate=new DateTime(2011,3,1);
             DateTime endDate = DateTime.Now;

             TimeSpan diff = endDate - startDate;
             int days = diff.Days;
             for (var i = 0; i <= days; i++)
             {
                 var testDate = startDate.AddDays(i);
                 switch (testDate.DayOfWeek)
                 {
                     case DayOfWeek.Saturday:
                     case DayOfWeek.Sunday:
                         Console.WriteLine(testDate.ToShortDateString());
                         break;
                 }
             }
           Console.ReadLine();
       }
   }
}
12

Если вы сделаете способ перечислить все дни, вы можете использовать linq для фильтрации в выходные дни:

IEnumerable<DateTime> GetDaysBetween(DateTime start, DateTime end)
{
    for (DateTime i = start; i < end; i = i.AddDays(1))
    {
        yield return i;
    }
}

var weekends = GetDaysBetween(DateTime.Today, DateTime.Today.AddDays(365))
    .Where(d => d.DayOfWeek == DayOfWeek.Saturday || d.DayOfWeek == DayOfWeek.Sunday);
  • 0
    Интересно, почему это было отклонено, для меня это прекрасно, и хотя оно более энергоемко, чем некоторые другие решения (которые не требуют перечисления всех дней, чтобы просто отфильтровать их), оно очень простое / чистое / поддерживаемое для проблемы, которая вряд ли когда-либо быть узким местом, если OP не работает на протяжении многих лет. Проголосовать, чтобы компенсировать.
  • 1
    Самая быстрая пушка на Западе стреляет себе в ногу: за нее проголосовали (не я), потому что когда ответ был впервые опубликован, он был плохо отформатирован и неполон. Нет никаких изменений, потому что Митч исправил это достаточно быстро, чтобы SO не считал это пересмотром, но не настолько быстро, чтобы другие могли его увидеть и понизить
Показать ещё 3 комментария
1

Это не очень сложно закодировать... Вот эффективный итератор:

public static IEnumerable<DateTime> GetWeekends(DateTime startDate, DateTime endDate)
{
    startDate = startDate.Date;
    endDate = endDate.Date;

    if (endDate < startDate)
        yield break;

    var currentDate = startDate;

    // Advance to next Saturday
    switch (currentDate.DayOfWeek)
    {
        case DayOfWeek.Saturday:
            break;

        case DayOfWeek.Sunday:
            yield return currentDate;
            currentDate = currentDate.AddDays(6);
            break;

        default:
            currentDate = currentDate.AddDays(DayOfWeek.Saturday - currentDate.DayOfWeek);
            break;
    }

    while (currentDate <= endDate)
    {
        yield return currentDate;

        currentDate = currentDate.AddDays(1);
        if (currentDate <= endDate)
            yield return currentDate;

        currentDate = currentDate.AddDays(6);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню