【问题标题】:Escaping while loop, while conditions are false转义while循环,while条件为假
【发布时间】:2019-10-26 03:56:11
【问题描述】:

我发现这不会在指定时间等待。

我一直在努力学习 c#,但还不知道所有语法到底是什么。我只是想知道是否有更好的方法来完成这项任务。

while (DateTime.Now.DayOfWeek == DayOfWeek.Saturday 
    && DateTime.Now.DayOfWeek == DayOfWeek.Sunday 
    && DateTime.Now.Hour <=8 
    && DateTime.Now.Hour >=18  
    && DateTime.Now.Minute <=9)
{
    Random waitTime = new Random();
    int milliseconds = waitTime.Next(120000, 180000);
    System.Threading.Thread.Sleep(milliseconds);
}

我希望它在星期六或星期日等待,如果它在 0800 之前、1800 之后,或者如果它在每小时的前十分钟。

问题是,我看到它在星期一晚上 7:05 退出循环,这是两个条件。我是否正确使用了 && 函数,还是应该用其他东西替换它?

【问题讨论】:

  • 你不能同时是周六和周日...此外DateTime.Now.DayOfWeek == DayOfWeek.Saturday &amp;&amp; DateTime.Now.DayOfWeek == DayOfWeek.Sunday在我们所在的星球上不可能是真的!我认为你想了解 || (或运算符)并理解布尔逻辑。 C1 OR C2 表示 C1 或 C2 可以为真以评估为真。 C1 AND C2 表示 C1 和 C2 都必须为真才能计算为真。
  • 另外,DateTime.Now.Hour 不能同时小于 8 和大于 18。
  • 您需要了解正确使用&amp;&amp;|| 以及优先顺序。你知道&amp;&amp; 的真正含义/作用吗?
  • 您的逻辑使用了所有“与”,但您的描述中有许多“或”。
  • 永远不需要在循环中创建新的随机生成器,否则您的下一个问题可能是经常被问到的问题。

标签: c# datetime wait dayofweek andand


【解决方案1】:

JonH 是对的,它不能同时是周六和周日。你的代码应该是这样的

            Random myRand = new Random();
        bool isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
        bool isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
        bool isFirstTenMinutes = DateTime.Now.Minute <= 9;

        //if you want to do Between 8 & 18 on Saturday/Sundays OR first 10 minutes of each hour on Saturday/Sunday

        while(isSatOrSun && (isNotBetween8And1800 || isFirstTenMinutes))
        {
            //do your sleep
            int waitTime = myRand.Next(120000, 180000);
            System.Threading.Thread.Sleep(waitTime);

            //now recheck your variables
            isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
            isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
            isFirstTenMinutes = DateTime.Now.Minute <= 9;
        }


        //if you want to do all day on Saturday/Sundays OR Between 8 & 18 any day of the week OR  first 10 minutes of each hour any day of the week

        while (isSatOrSun || isNotBetween8And1800 || isFirstTenMinutes)
        {
            //do your sleep
            int waitTime = myRand.Next(120000, 180000);
            System.Threading.Thread.Sleep(waitTime);

            //now recheck your variables
            isSatOrSun = DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
            isNotBetween8And1800 = DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18;
            isFirstTenMinutes = DateTime.Now.Minute <= 9;
        }

【讨论】:

  • 最后一个 OR 可能不正确,这取决于他想要什么......他可能希望它只出现在周六和周日......但不确定很模糊。
  • @JonH 是的,我会用不同的选项更新它,以对他正在寻找的内容进行不同的解释。
  • @JonH 如果任何条件为真,我希望它暂停。
  • @chris-crush-code 完美!!这给了我很多信息,我将能够将其修改为我想要的。教我布尔变量代码,并仔细检查。我喜欢它。
  • @chris-crush-code 我对最后三行如何用于仔细检查感到有些困惑。它是否更新isSatOrSun 和其他以反映当前时间?您是否必须这样做,因为您之前设置了这些变量?如果我使用扩展版本而不是布尔变量呢?
【解决方案2】:

由于您正在学习,我建议您对逻辑使用布尔方法并在 while 函数上调用它,如下所示:

方法:

public static bool IsWaitingTime()
{
 if ( ( DateTime.Now.DayOfWeek == DayOfWeek.Saturday  || DateTime.Now.DayOfWeek == DayOfWeek.Sunday )
 && ( DateTime.Now.Hour <= 8 || DateTime.Now.Hour >= 18 ) 
 && DateTime.Now.Minute <= 9 ) 
   return true;
else
   return false;
} 

While 循环:


while ( IsWaitingTime )
    {
        Random waitTime = new Random();
        int milliseconds = waitTime.Next(120000, 180000);
        System.Threading.Thread.Sleep(milliseconds);
    }

正如@JonH 所说,这是一种方法,日期不能同时是星期六和星期日(至少在同一时区)。 chris-crush-code 的 anwser 也是正确的。

【讨论】:

    【解决方案3】:

    根据我在过去 20 分钟内了解到的情况,如果满足以下任何条件,这似乎会暂停; 是星期天吗 是星期六吗 是不是早于0800, 是不是晚于1800年, 分钟是否小于 10

    Random waitTime = new Random();
    while (DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday || DateTime.Now.Hour <=8 || DateTime.Now.Hour >=18  || DateTime.Now.Minute <=9)
    {
    int milliseconds = waitTime.Next(120000, 180000);
    System.Threading.Thread.Sleep(milliseconds);
    }
    

    【讨论】:

    • 这是对问题的回答、新问题、评论,还是完全其他的? 请仅在答案部分发布答案。完全不清楚这是为了回答这个问题,特别是因为已经有一个公认的答案。
    • @EricLippert 这是一个答案。我接受了 chris-chrus-code 的答案,因为它是最广泛、最有用的答案。我通常会发布我将在脚本中使用的内容作为答案,以向任何感兴趣的人展示并获得潜在的反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多