2010-04-21 4 views
9

Я пытаюсь Переберите КАЖДЫЙ DAYof НЕДЕЛИ от 2 периодов времениПеребор дни недели внутри C# TimeSpan класса

DateTime start = new DateTime(2010, 1, 1); 
    DateTime end = new DateTime(2011, 12, 12); 

мне удалось получить количество дней между этими датами, используя следующий код

 TimeSpan range = (end - start); 

оказывается 710.

Я теперь хочу получить за каждый месяц в дни недели,

Например,

Jan 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 171 18 19 20. , ,

с соответствием

M T W T F S S M T W T F S S M

Я понимаю, C# имеет свойство из DateTime класса DayOfWeek который получает день недели моей проблемы построения петли сделать выше?

Кто-нибудь?

+1

Быстрый способ: http://stackoverflow.com/questions/22258070/datetime-dayofweek-micro-optimization – rpax

ответ

20

Это будет проходить через все дни с даты начала до конца и получить день недели для каждого.

DateTime startDate = new DateTime(2010, 1, 1); 
DateTime endDate = new DateTime(2011, 12, 12); 
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1)) 
{ 
    DayOfWeek dw = date.DayOfWeek; 
    // ... 
} 

Если вы не беспокоитесь об оптимизации, я бы не стал более сложным.

+0

для (дата DateTime = STARTDATE; дата <= ENDDATE; дата = date.AddDays (1)) { DayOfWeek dw = date.DayOfWeek; // ...} Большое спасибо, Цените это :) – Calibre2010

+0

Если он действительно беспокоится об оптимизации, он взглянуть на http://stackoverflow.com/questions/22258070/datetime-dayofweek-micro может -оптимизация. Это смешно – rpax

+0

Вряд ли стоит подменить пользовательскую (и, вероятно, багги) функцию для библиотечного метода, особенно когда она даже не меняет сложность Big-O. И снова, если вы работаете с * очень жесткими ограничениями производительности, вы можете просто полностью избежать всего вычисления и просто создать цикл от 1 до 7 с простым условием тестирования. Я предпочитаю метод выше, потому что его просто читать/понимать, что 9 раз из 10 должно быть вашей целью. – Aaronaught

3

Мне нравится следующее:

static IEnumerable Days(DateTime start, DateTime end) 
{ 
    while (start < end) 
    { 
     string day = start.ToString("ddd"); 

     start = start.AddDays(1); 

     yield return day; 
    } 
} 

Как использовать:

foreach(string s in Days(new DateTime(2010, 1, 1), new DateTime(2010, 2, 1))) 
{ 
    Console.WriteLine(s); 
} 

Вы можете изменить его, чтобы вернуть различные типы, конечно.

2

Использование LINQ:

DateTime start = new DateTime(2010, 1, 1); 
DateTime end = new DateTime(2011, 12, 12); 
int days = (end - start).Days; 

Enumerable 
    .Range(0, days) 
    .Select(x => start.AddDays(x)) 
    .ToList() 
    .ForEach(d => 
    { 
     DayOfWeek dayOfWeek = d.DayOfWeek; 
     // do what you want 
    }); 
+0

Хорошее решение :) –