c# - 如何确定日期是否是一个月中的第 n 个 List<WeekDay>?

标签 c# .net date

我见过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/

相关文章:

javascript - 如何根据给定的开始日期和期限持续时间动态设置结束日期?

c# - 如何创建强大的斐波那契算法?

.net - 如何锁定表的一行

c# - 标记为 OneWay 的 WCF 操作是否存在执行超时?

.net - Razor 引擎中的西里尔字符问题

java - 使用 Hibernate SQL 查询在日期范围内搜索文档

java - 刷新文本/JLabel 值

c# - 在 C# 中为 RichTextBox 中的所有事件着色的更快方法

c# - 使用 Moq 框架模拟方法不会返回预期结果

c# - 如何将事件处理程序添加到表适配器中的 RowUpdated 事件