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)))
我需要缩短这个条件,您有什么建议吗?
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)))
好的,您可以编写一个扩展方法:
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))...
这样更简洁吗?或许是,但在我看来更重要的是它更易读和易维护:
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))
{
}
Now
也是一个相对昂贵的“属性”。它甚至需要使用IO
访问:https://dev59.com/f2TWa4cB1Zd3GeqPFJ-F#10900267 - Tim SchmelterDayOfWeek.Friday, DayOfWeek.Saturday
以外的所有天数;-) - Tim Schmelter(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)
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);
}
我认为没有合理的解决方案,但有几个想法。可以使用别名来代替 DateTime
和 DayOfWeek
。另一个选项是在条件语句之前将所有这些值赋给变量。
所以你可以这样做:
string fri = DayOfWeek.Friday;
string sat = DayOfWeek.Saturday;
然后在条件语句中使用它们。或者;
using dt = DateTime;
然后你可以执行dt.Now.DayOfWeek
我个人不建议这样做。你并没有真正缩短条件语句,而是进行了重构。如果在一个类中有很多这样的语句,那么可能值得权衡一下,否则就不必了。
编辑:Michael Perrenoud提出的扩展方法建议是一个合理的解决方案,而且效果非常好。
DayOfWeek
检查减少为:(Int32)DateTime.Now.DayOfWeek < 5
。这样翻译更加通俗易懂,但没有改变原意。 - DonBoitnott