4
if ((DateTime.Now.DayOfWeek != DayOfWeek.Friday && DateTime.Now.DayOfWeek != DayOfWeek.Saturday) &&
((DateTime.Now.Hour >= 10 && DateTime.Now.Hour < 13) || (DateTime.Now.Hour >= 20 && DateTime.Now.Hour < 23)))

我必须缩短这个条件,有什么建议吗?

4

5 回答 5

4

好吧,您可以构建一个扩展方法:

public static bool BoundsCheck(this DateTime d, int min, int max, int min2, int max2)
{
    return (d.DayOfWeek != DayOfWeek.Friday &&
        d.DayOfWeek != DayOfWeek.Saturday &&
        d.Hour >= min &&
        d.Hour < max) ||
        (d.Hour >= min2 && d.Hour < max2);
}

然后这样称呼它:

if (DateTime.Now.BoundsCheck(10, 13, 20, 23))...
于 2013-06-19T20:08:01.727 回答
4

这是更短的吗?也许,但在我看来更重要的是它更具可读性和可维护性:

var now = DateTime.Now;
var notAllowedDays = new[] { DayOfWeek.Friday, DayOfWeek.Saturday };
var allowedHours = Enumerable.Range(10, 3).Concat(Enumerable.Range(20, 3));
if(!notAllowedDays.Contains(now.DayOfWeek) && allowedHours.Contains(now.Hour))
{

} 
于 2013-06-19T20:08:50.310 回答
4

您可以更改使用时间

(DateTime.Now.Hour % 12) +1 >= 10 && (DateTime.Now.Hour % 12) +1 < 13

甚至可能没有第二次检查。

我认为除了寻找其他方法(例如其他答案)之外,您没有比这更多的改进了

更新 我测试了上述内容及其错误,但这更加虐待狂并且有效

var check = (DateTime.Now.Hours - 10 % 12) % 10;
 var checkV = (DateTime.Now.Hours >= 10 && check < 3);

测试代码

for (int i = 0; i < 24; i++)
{
    var check = (i - 10 % 12) % 10;
    bool checkV = (i >= 10 && check < 3);
    Console.WriteLine(i.ToString() + ": " + checkV.ToString());
 }
 Console.ReadKey();

更新 2 完整的缩短代码

if(   (int)DateTime.Now.DayOfWeek < 5 && 
           DateTime.Now.Hours >= 10 && 
         ((DateTime.Now.Hours - 10 % 12) % 10) < 3)
于 2013-06-19T20:15:55.787 回答
2
if (!this.ItsPartyDay() && (this.ItsLunchTime() || this.ItsDinnerTime()))
{
    ...
}

private bool ItsPartyDay()
{
    return (Int32)DateTime.Now.DayOfWeek >= 5;
}

private bool ItsLunchTime()
{
    return (DateTime.Now.Hour >= 10 && DateTime.Now.Hour < 13);
}

private bool ItsDinnerTime()
{
    return (DateTime.Now.Hour >= 20 && DateTime.Now.Hour < 23);
}
于 2013-06-19T20:21:37.710 回答
0

我认为没有任何合理的解决方案,但我想到了几个。DateTime为和使用别名DayOfWeek。另一种选择是将所有这些值分配给条件之前的变量。

所以你可以做这样的事情;

 string fri = DayOfWeek.Friday;
 string sat = DayOfWeek.Saturday;

然后在条件中使用那些。或者;

 using dt = DateTime;

然后你可以做dt.Now.DayOfWeek

我个人不建议做这两件事。你实际上并没有缩短条件,你只是在重构。如果你在一个班级中有很多这样的东西,那么它可能值得权衡,否则可能不是。

编辑:Michael Perrenoud 的扩展方法建议是一个合理的解决方案,实际上效果很好。

于 2013-06-19T20:11:09.810 回答