Nie jestem nawet pewien, jak to zrobić bez użycia jakiegoś okropnego rozwiązania dla pętli / licznika. Oto problem:
Dostaję dwie daty, datę początkową i datę końcową, aw określonych odstępach czasu muszę podjąć pewne działania. Na przykład: dla każdej daty od 3/10/2009 co trzeci dzień do 26.03.2009 muszę utworzyć pozycję na liście. Więc moje dane wejściowe to:
DateTime StartDate = "3/10/2009";
DateTime EndDate = "3/26/2009";
int DayInterval = 3;
a moim wynikiem byłaby lista z następującymi datami:
3/13/2009 3/16/2009 3/19/2009 3/22/2009 3/25/2009
Więc jak do cholery miałbym zrobić coś takiego? Pomyślałem o użyciu pętli for, która będzie iterować między każdym dniem w zakresie z osobnym licznikiem w ten sposób:
int count = 0;
for(int i = 0; i < n; i++)
{
count++;
if(count >= DayInterval)
{
//take action
count = 0;
}
}
Ale wydaje się, że może być lepszy sposób?
Odpowiedzi:
Cóż, musisz je zapętlić w taki czy inny sposób. Wolę zdefiniować taką metodę:
Następnie możesz użyć tego w następujący sposób:
W ten sposób możesz uderzać co drugi dzień, co trzeci dzień, tylko w dni powszednie itp. Na przykład, aby wrócić co trzeci dzień, zaczynając od daty „rozpoczęcia”, możesz po prostu zadzwonić
AddDays(3)
w pętli zamiastAddDays(1)
.źródło
Mam
Range
zajęcia w MiscUtil, które mogą ci się przydać. W połączeniu z różnymi metodami rozszerzenia możesz:(Możesz lub nie chcesz wykluczyć koniec - pomyślałem, że podam go jako przykład).
Jest to w zasadzie gotowa (i bardziej ogólna) forma rozwiązania mquandera.
źródło
ExcludeEnd()
jest uroczy.Na przykład możesz spróbować
źródło
Kod z @mquander i @Yogurt The Wise używany w rozszerzeniach:
źródło
EachDayTo
iEachMonthTo
? Myślę, że coś mi umknęło.źródło
1 rok później, czy może komuś pomóc,
Ta wersja zawiera predykat , aby być bardziej elastycznym.
Stosowanie
Codziennie na moje urodziny
Co miesiąc do moich urodzin, krok 2 miesiące
Co roku na moje urodziny
Użyj
RangeFrom
zamiast tegoRealizacja
Dodatki
Możesz zgłosić wyjątek, jeśli
fromDate > toDate
, ale wolę zamiast tego zwrócić pusty zakres[]
źródło
źródło
while
uruchomieniu.W zależności od problemu możesz spróbować tego ...
dzięki......
źródło
źródło
Możesz zamiast tego napisać iterator, który pozwala używać normalnej składni pętli „for”, takiej jak „++”. Przeszukałem i znalazłem podobne pytanie , na które udzielono odpowiedzi na StackOverflow, które daje wskazówki na temat iteracji DateTime.
źródło
Możesz użyć tej
DateTime.AddDays()
funkcji, aby dodać swojąDayInterval
doStartDate
i sprawdzić, czy jest mniejsza niżEndDate
.źródło
musisz uważać tutaj, aby nie przegapić dat, kiedy w pętli byłoby lepszym rozwiązaniem.
daje to pierwszą datę rozpoczęcia i użyj jej w pętli przed zwiększeniem, a przetworzy wszystkie daty, w tym ostatnią datę zakończenia, stąd <= data zakończenia.
więc powyższa odpowiedź jest poprawna.
źródło
możesz tego użyć.
źródło
Iteruj co 15 minut
źródło
@ jacob-sobus i @mquander i @Yogurt nie są dokładnie poprawne .. Jeśli potrzebuję następnego dnia, najczęściej czekam 00:00
źródło
Oto moje 2 centy w 2020 roku.
źródło