Basierend auf der Antwort von Jacob Proffitt, aber ohne den Overhead der In-Memory-Liste. Da DaysBetween seine Daten dynamisch liefert, wird die Anzahl berechnet, wenn die Liste generiert wird:
int c = DaysBetween(begin, end).Count(d => d.DayOfWeek != DayOfWeek.Sunday);
private IEnumerable<DateTime> DaysBetween(DateTime begin, DateTime end)
{
for(var d = begin; d <= end; d.AddDays(1)) yield return d;
}
Wenn Sie LINQ nicht zur Schau stellen wollten, könnten Sie es natürlich vereinfachen und mit einer Funktion arbeiten:
private int DaysBetween(DateTime begin, DateTime end)
{
int count = 0;
for(var d = begin; d <= end; d.AddDays(1))
if(d.DayOfWeek != DayOfWeek.Sunday) count++
return count;
}
IMHO sind beide sauberer und einfacher zu verstehen, zu debuggen, Fehler zu beheben und zu modifizieren als der Favorit von allen (die Antwort von Rabe).
Natürlich ist dies eine O(n)-Lösung, d. h. je weiter die Tage auseinander liegen, desto länger dauert die Berechnung. Während dies für die meisten Anwendungen in der realen Welt in Ordnung ist, können Sie in einigen Fällen einen formelbasierten Ansatz bevorzugen, etwa in dieser Form:
int q = end.Subtract(begin).Days - (end.Subtract(begin).Days / 7);