首页 > 解决方案 > 为闹钟打盹

问题描述

我必须为班级修改一个警报程序,但我不明白为什么它不起作用。希望有人能给我一些见解。它现在的工作方式是在程序启动时加载几个警报。

每个警报都是添加到数组中的警报类的对象,其中枚举 AlarmState 设置为“开”。它循环遍历数组,如果一个警报与当前时间匹配且 AlarmState 为“On”,则警报响起,将 DateTime 变量“snoozeTime”设置为未来 5 秒,并将状态更改为“Snooze”。但是,如果它在数组中循环并且一个警报与 snoozeTime 匹配并且状态为“Snooze”,那么它将警报状态更改为“Off”。

现在,状态发生变化,并且 snoozeTime 变量设置正确。但是,警报似乎永远不会与 snoozeTime 匹配,即使当我打印 snoozeTime 时它看起来也匹配。另外,如果你好奇我为什么在未来只设置 5 秒的贪睡时间,那是因为我还不知道如何使用按键。

这是主程序的相关部分:

// Get current time.
DateTime currTime = DateTime.Now;
DateTime snoozeTime = new DateTime();
// Continually show current time until alarm time reached.
while (alarms.Length > 0)
{
    Console.WriteLine("Current time is: {0:HH:mm:ss}", currTime);

    // WRITE LOOP TO CHECK WHETHER ANY ALARMS MATCH.
    foreach (var alarm in alarms)
    {

        if (alarm.Matches(currTime))
        {
            Console.WriteLine("Alarm going off at: {0}", alarm.FormattedTime());
            //alarm.Minute += 1;
            snoozeTime = DateTime.Now.AddSeconds(5.0);
            alarm.State = AlarmState.Snooze;
            Console.WriteLine("Snooze set for: {0}", snoozeTime);
        }

        if (alarm.Matches(snoozeTime) && alarm.State == AlarmState.Snooze)
        {
            Console.WriteLine("Shutting off");
            //set state to off
            alarm.State = AlarmState.Off;
        }
    }  

    Thread.Sleep(1000);  // pause for a second

    currTime = DateTime.Now;  // update current time
}

这是我正在使用的匹配方法:

// Returns whether alarm should go off at time "when".
public bool Matches(DateTime when)
{

    return (State != AlarmState.Off && Hour == when.Hour && Minute == when.Minute && Second == when.Second);

    //return (State == AlarmState.On || State == AlarmState.Snooze) &&
        //Hour == when.Hour && Minute == when.Minute && Second == when.Second;
}

标签: c#arraysdatetimeforeach

解决方案


正如 Maxime 作为对您问题的评论所说的那样,您绝对应该检查alarm.State == AlarmState.On您的第一个 If 语句,否则您的警报将与两个 if 语句连续匹配。

我更担心的是,一旦alarm.Matches(currTime)满足,你就设置了,alarm.State == AlarmState.Snooze但你似乎永远不会更新设置闹钟的时间。这个含义alarm.Matches(snoozeTime) && alarm.State == AlarmState.Snooze永远不会正确,因为您设置闹钟的时间已经过去。


推荐阅读