我见过this question ,它查找特定月份中的第 N 个工作日,但我想要一些可以查找给定月份中的第 N 个 [工作日列表] 的内容。有没有一种简单的方法可以做到这一点,而无需循环遍历该月的每一天?
例如,如果我说我想要 3rd [Mon, Wed, Fri]
在一个月中,如果该月从星期三开始,则应返回第一个星期一(1 = 星期三,2 = 星期五,3 = 星期一)。如果我说我想要 2nd last [Mon, Tue, Wed, Thurs]
如果该月的最后一天是星期日,则应返回上一个星期三。
最佳答案
嗯,我的意思是你可能会想出一些基于公式且避免循环的丑陋且难以理解的东西,但它会丑陋且难以理解,因此容易出现错误,并且是维护灾难,而且尝试起来一点也不有趣。想出。
相反,只需想出使用循环可以轻松编写的内容,然后使用 LINQ隐藏循环即可:
static class DateTimeExtensions {
private static IEnumerable<DateTime> DaysOfMonth(int year, int month) {
return Enumerable.Range(1, DateTime.DaysInMonth(year, month))
.Select(day => new DateTime(year, month, day));
}
public static DateTime NthDayOfMonthFrom(
this HashSet<DayOfWeek> daysOfWeek,
int year,
int month,
int nth
) {
return
DateTimeExtensions.DaysOfMonth(year, month)
.Where(
date => daysOfWeek.Contains(date.DayOfWeek)
)
.Skip(nth - 1)
.First();
}
}
用法:
var daysOfWeek = new HashSet<DayOfWeek> {
DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Friday
};
DateTime date = daysOfWeek.NthDayOfMonthFrom(2011, 6, 3));
Assert.Equal(date, new DateTime(2011, 6, 6));
同样,使用Reverse
,您可以轻松编写NthLastDayOfWeekFrom
。我会让你想出一个更好的名字。
关于c# - 如何确定日期是否是一个月中的第 n 个 List<WeekDay>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7407056/