【问题标题】:Better way of getting First Date of Week by passing Week number of the year in c#? [duplicate]通过在 c# 中传递一年中的周数来获得一周的第一个日期的更好方法? [复制]
【发布时间】:2015-11-06 16:26:51
【问题描述】:

我编写了以下方法,以便通过传递年份和年份的周数返回第一个日期,我认为星期一是一周的第一天。我想知道是否有更好的方法可以计算这个。这是我的代码;

 public static DateTime GetFirstDateOfWeekByWeekNumber(int year, int weekNumber)
    {
        var date = new DateTime(year, 01, 01);
        var firstDayOfYear = date.DayOfWeek;
        var result = date.AddDays(weekNumber * 7);

        if (firstDayOfYear == DayOfWeek.Monday)
            return result.Date;
        if (firstDayOfYear == DayOfWeek.Tuesday)
            return result.AddDays(-1).Date;
        if (firstDayOfYear == DayOfWeek.Wednesday)
            return result.AddDays(-2).Date;
        if (firstDayOfYear == DayOfWeek.Thursday)
            return result.AddDays(-3).Date;
        if (firstDayOfYear == DayOfWeek.Friday)
            return result.AddDays(-4).Date;
        if (firstDayOfYear == DayOfWeek.Saturday)
            return result.AddDays(-5).Date;
        return result.AddDays(-6).Date;
    }

【问题讨论】:

  • 获取本周的第一个星期一?
  • 看起来@GSerg 发布了您要查找的内容。如果你不这样做,你至少应该把它变成一个switch,而不是所有的ifs。
  • @MaxPoshusta switch 如何比 if 更好?我记得,人们建议避免使用 switch case。你能告诉我任何论证 switch 比 if 更好吗,谢谢?
  • 我不知道你为什么要避开switch/case。做任何使你的代码最易读的事情。在您的情况下,它将使用switch/case
  • 也许您正在考虑使用switch/case 进行多态性。那是糟糕的设计。见programmers.stackexchange.com/a/147227/20458

标签: c#


【解决方案1】:

如果你想替换那个 if/else 结构,你可以使用底层的枚举值来计算。枚举以Sunday = 0Monday = 1 开头,因此为了获得基于星期一的值,您需要将其移动一个。您可以通过以下方式做到这一点:

int delta = -((int)firstDayOfYear + 6) % 7;

// and then just apply the delta
return result.AddDays(delta).Date

作为网站说明,请勿使用多个 ifs 并按顺序使用互斥条件。在您的示例中,如果工作日是 Monday,则构造仍会根据 每个 条件检查该值。但是如果你使用了正确的if/else if/else 结构,那么它只会做第一次检查然后跳到最后。使用switch 语句也可以避免这种情况,因为要采取的分支是在一个步骤中评估的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2010-12-12
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多