Fragensteller
den nächsten Wert in einem Array[Uhrzeiten] für Countdown benutzen wenn Countdown des jetzigen = 0

Frage
-
Hi zusammen,
es soll praktisch weiter runtergezählt werden bis zur nächsten Uhrzeit des bereits sortierten Arrays
Ich hoffe mal, dass ich mein Probblem halbwegs verständlich dargestellt habe
Wäre sehr dankbar für jede Idee wie man das realisieren könnte.
Alle Antworten
-
Hallo,
Deine Beschreibung in einem Satz läßt zuviel Raum für Spekulationen.
Welcher CountDown ist dort gemeint und wer oder was zählt da?
Es wäre hilfreich, wenn Du einen Codeschnipsel bereitstellen würdest,
anhand dessen man erkennen kann, was da passieren soll.Gruß Elmar
-
public partial class MainPage { int[] timeofday = new int[] { 1440,1402,1416,1368, 1398 }; //time of day in minutes since 00:00 oclock private DispatcherTimer timer; public MainPage() { InitializeComponent(); Loaded += OnLoaded; } private void OnLoaded(object sender, RoutedEventArgs e) { timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) }; timer.Tick += OnTick; timer.Start(); Array.Sort(timeofday); } private void OnTick(object sender, EventArgs e) { var next = DateTime.Today.AddMinutes(timeofday [0]); var timeLeft = next - DateTime.Now; Countdown.Text = String.Format("{0:D1}:{1:D2}:{2:D2}", timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds); } }
der countdown zählt ja bis timeofday[0] runter, also hier 1368 = 22:48 Uhr (kleinste Uhrzeit)
Jetzt meine Frage: kann man das ganze nicht irgendwie in eine Schleife packen, sodass der Countdown weiter zu timeofday[1] runterzählt, wenn die Uhrzeit timeofday[0] (timeLeft =0) erreicht wurde?
anschließend weiter zu timeofday[2] usw
-
Hi mattshark,
du kannst oben noch eine Membervariable Deklarieren zB intCounter = 0.
Im OnTick änderst du dann die zuweisung von next in:
var next = DateTime.Today.AddMinutes(timeofday [intCounter]);
Und nach dem zuweisen von timeLeft Prüst du ob timeLeft<=0 ist wenn ja Zahlst du deinen Count um einen Hoch.
MFG
Björn
-
Hallo,
da ein Zwischenspeichern den Aufwand nicht wert ist,
kannst Du Dir die aktuell gültigen CountDown-Minute jeweils "beim Ticken" ermitteln.Unten rufe ich den aktuellen Wert jeweils über Linq ab,
wobei ich zudem den Fall berücksichtigt habe, dass keine weitere Zeit mehr vorhanden ist.int[] timeofday = new int[] { 440, 402, 316, 168, 398, 869 }; private void OnTick(object sender, EventArgs e) { // In Variable übernehmen (denn die Zeit in DateTime.Now läuft weiter) var now = DateTime.Now; var currentTime = (now - now.Date); var totalMinutes = (int)Math.Ceiling(currentTime.TotalMinutes); // ganze Minuten // Nächstes CountDown abrufen // geht von sortiertem Array aus int? timeMinutes = this.timeofday .Cast<int?>() .FirstOrDefault(minute => minute >= totalMinutes); if (timeMinutes.HasValue) { var nextTime = now.Date.AddMinutes(timeMinutes.Value); var timeLeft = nextTime - now; this.CountDown.Text = String.Format("{0:hh\\:mm\\:ss}", timeLeft); //this.CountDown.Text = String.Format("{0:c}", timeLeft); // genauer // this.CountDownMinutes.Text = nextTime.ToString(); // Anzeige der Auswahl } else { // Nichts mehr vorhanden this.CountDown.Text = "Abgelaufen"; //this.CountDownMinutes.Text = "NULL"; } }
Als zusätzliche Hinweise:
Beim Berechnen solltest Du die Werte in Variablen speichern.
Denn DateTime.Now kann zwischen zwei Aufrufen bereits einen neuen Wert annehmen -
auch wenn das hier kaum ins Gewicht fallen dürfte.Auch dürfte der Timer mit 500 oder 1000ms ausreichend oft bedient sein.
Zum Formatieren kann man sich der TimeSpan-Standardformatzeichenfolgen bedienen.
Gruß Elmar