2017-04-20 14 views
2

現在、複数の(再発生している)アラームを持つアラームクロックで作業しています。アラームのセットから最初のアラーム時刻を取得する

私はMicrosoft IoTがインストールされたラズベリーパイと、レイアウトとその基礎となるアルゴリズムについてはUWP(C#)を使用しています。

私が実行している問題は、次のアラーム時刻を取得することです。

擬似コード:

Select nextAlarm() 
    For all alarms a 
     if (((a.time >= now.time AND a.repeatDay == now.DayOfWeek) 
      OR a.repeatDay > now.DayOfWeek) AND a.dateTime < currentAlarm.dateTime) 
       currentAlarm = a; 

現在の日が水曜日である場合は、この(n)は、すべてのアラームの時間と機能a.repeatDayをOがかかります> now.DayOfWeekは些細な機能(ではなく、次のアラームは月曜日です)、機能は動作しません。

上記の機能が動作するように(そしてO(n)よりも速く)アラームを保存するにはどうすればよいですか、問題が解決されたという繰り返し日をどのように保存することができますか?現在SQLite.net-PCLパッケージに

アラームとRepeatDayクラス使用

public class Alarm 
{ 
    [PrimaryKey, AutoIncrement] 
    public long Id { get; set; } 

    [NotNull] 
    public string Name { get; set; } 

    [NotNull] 
    public DateTime Time { get; set; } 

    [NotNull] 
    public int Repeat { get; set; } 

    public Alarm(string name, DateTime time, RepeatWeek repeat) 
    { 
     this.Name = name; 
     this.Time = time; 
     this.Repeat = repeat; 
    } 

} 

public class RepeatWeek 
{ 
    int repeat = 0; 
    public static implicit operator int(RepeatWeek w) 
    { 
     return w.repeat; 
    } 

    public void setDay(DayOfWeek w) 
    { 
     repeat |= 1 << (int)w; 
    } 

    public void removeDay(DayOfWeek w) 
    { 
     repeat &= ~(1 << (int)w); 
    } 

    public DayOfWeek getNext(DayOfWeek d, bool inclToday = false) 
    { 
     throw new NotImplementedException(); 
     return DayOfWeek.Monday; //Needs work 
    } 
}  
+0

次回の予定アラームが必要ですか? – maccettura

+0

はい、私は現在、繰り返しの日に立ち往生しています – Boe007

+0

ちょうどダニをチェックし、最低値のものをつかむのはなぜですか? – maccettura

答えて

1

を私はGetNextDayを実装するために私の手を試してみました。次に、Alarm.GetNextを実装するのは簡単なことになります。さらに簡単なLINQクエリが必要な処理を行います。私はあなたのためにそれを実装するためにいくつかを残したので、あなたはそれをしたと言うことができます。

public class Alarm 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public DateTime Time { get; set; } 

    public int Repeat { get; set; } 

    public Alarm(string name, DateTime time, RepeatWeek repeat) 
    { 
     this.Name = name; 
     this.Time = time; 
     this.Repeat = repeat; 
    } 

    public DateTime GetNext() 
    { 
     var includeToday = true; 
     if (DateTime.Now.TimeOfDay > Time.TimeOfDay) 
     { 
      includeToday = false; 
     } 

     var repeat = new RepeatWeek(Repeat); 
     var nextDayOfWeek = repeat.GetNextDay(includeToday); 
     return MergeDayOfWeekAndTime(nextDayOfWeek, Time); 
    } 

    private DateTime MergeDayOfWeekAndTime(DayOfWeek? nextDayOfWeek, DateTime Time) 
    { 
     //Left as exercise to the reader. 
     throw new NotImplementedException(); 
    } 
} 

public class RepeatWeek 
{ 
    int Repeat; 

    public RepeatWeek(int repeat = 0) 
    { 
     Repeat = repeat; 
    } 

    public static implicit operator int(RepeatWeek w) 
    { 
     return w.Repeat; 
    } 

    public void setDay(DayOfWeek w) 
    { 
     Repeat |= 1 << (int)w; 
    } 

    public void removeDay(DayOfWeek w) 
    { 
     Repeat &= ~(1 << (int)w); 
    } 

    public static DayOfWeek FollowingDayOfWeek(DayOfWeek day) 
    { 
     if (day == DayOfWeek.Saturday) 
     { 
      return DayOfWeek.Sunday; 
     } 
     else 
     { 
      return day + 1; 
     } 
    } 

    public DayOfWeek? GetNextDay(bool inclToday = false) 
    { 
     var inspect = DateTime.Now.DayOfWeek; 
     if (!inclToday) 
     { 
      inspect = FollowingDayOfWeek(inspect); 
     } 

     for (int i = 0; i < 7; i++) 
     { 
      if ((Repeat & (1 << (int)inspect)) > 0) return inspect; 
      inspect = FollowingDayOfWeek(inspect); 
     } 
     return null; 
    } 
} 

[TestClass] 
public class MyTestClass 
{ 
    [TestMethod] 
    public void GetNextDayOfWeek() 
    { 
     var repeat = new RepeatWeek(); 
     repeat.setDay(DayOfWeek.Monday); 
     repeat.setDay(DayOfWeek.Tuesday); 
     var expected = DayOfWeek.Monday; 
     if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) 
     { 
      expected = DayOfWeek.Tuesday; 
     } 

     var actual = repeat.GetNextDay(); 
     Assert.AreEqual(expected, actual); 
    } 

    [TestMethod] 
    public void GetNextAlarm() 
    { 
     //Populate this yourself. 
     var alarms = new List<Alarm>(); 
     var nextAlarm = alarms.Select(a => a.GetNext()).OrderBy(a => a.Ticks).FirstOrDefault(); 
    } 
} 
+0

受け入れ、それは曜日を通して反復を示します。 – Boe007

関連する問題