【问题标题】:Looping within a timespan在时间跨度内循环
【发布时间】:2014-03-09 12:54:29
【问题描述】:

编写一个简单的控制台应用程序来学习一些东西。应用程序使用 for 循环,并且按预期运行,除非它到达带有开始和结束 DateTime 条件的 while 循环。然而,while 循环只是一直打印出“Graduation”直到永远..

我只是想让 while 循环运行并将“毕业”打印到控制台 5 秒,然后继续计数到 2020 年。我错过了什么?

static void Main(string[] args)
{

    DateTime start = DateTime.Now.AddSeconds(0);

    DateTime end = DateTime.Now.AddSeconds(5);


    for (int i = 1988; i < 2020; i += 2)
    {


        if (i == 2000)
        {
            Console.WriteLine("New Mellenium");

            continue;
        }



        if (i == 2006)
        {


            Console.WriteLine("Age of Majority");

            continue;
        }


        if (i == 2014)
        {

            while (start < end)
            {

                Console.WriteLine("Graduation!!!");

                continue;
            }


        }



        Console.WriteLine(i);
        Console.ReadKey();



    }

谢谢

【问题讨论】:

  • 如果你进入“毕业!!!”事情,你永远在那里。
  • 你永远不会改变 startend dateTime 对象,这就是原因!

标签: c# loops datetime console-application conditional-statements


【解决方案1】:

您永远不会更改 startend 日期,因此它们的值永远保持不变。

您的意图并不完全清楚,但我假设您想要“毕业!”连续输出5秒:

for (int i = 1988; i < 2020; i += 2)
{
    if (i == 2000)
    {
        Console.WriteLine("New Mellenium");
        continue;
    }
    if (i == 2006)
    {
        Console.WriteLine("Age of Majority");
        continue;
    }
    if (i == 2014)
    {
        DateTime now = DateTime.Now;
        DateTime end = now.AddSeconds(5);
        while (now < end)
        {
            Console.WriteLine("Graduation!!!");
            now = DateTime.Now;                // <---- this line is the key
        }
    }
    Console.WriteLine(i);
    Console.ReadKey();
}

【讨论】:

    【解决方案2】:

    您忘记在循环结束时增加 start 变量。

    将其放在循环的末尾,Console.ReadKey(): 之后:

    start = DateTime.Now;
    

    不过,此程序将运行超过 10 秒,因为您的 Console.ReadKey() 将延迟程序,无论每次循环迭代时按下该键所需的时间。

    【讨论】:

    • start.AddSeconds(1) 不会做任何事情。日期时间是不可变的。
    【解决方案3】:

    将您的“while 语句”更改为:

     while (start < end)
                {
    
                    Console.WriteLine("Graduation!!!");
                    start =  DateTime.Now;
                    continue;
                } 
    

    【讨论】:

      【解决方案4】:

      作为我的第一条评论,您永远不会更改开始和结束 dateTime 对象,这就是原因!

      在这种情况下,您可以尝试检查end 是否在当前时间命中。

      while (DateTime.Now < end)
         Console.WriteLine("Graduation!!!");
      

      【讨论】:

        【解决方案5】:

        在这种情况下,您不会在 while 循环内更新 start。它将永远具有价值 无论您何时致电System.DateTime.Now.AddSeconds(0)

        其次,你的逻辑不对。您不需要第一次拨打AddSeconds,因为您没有添加秒数,这只会浪费时间。其次,你应该这样设置 end: end=start.AddSeconds(5),因为对System.DateTime.Now 的两次调用会略有不同,在特定情况下可能会大不相同。

        【讨论】:

        • 是的,当然,我真正打算做的是增加秒数,直到达到 5。
        • @KristofferAndersson 所以您不想实时执行此操作?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多