C# nachfolgende Listenelemente löschen

knappenboy

Mitglied
Hallo,

ich möchte aus einer Liste (Elementanzahl unbekannt) alle nachfolgenden Elemente löschen.

Folgenden Code verwende ich:

Code:
 private void button_Click(object sender, RoutedEventArgs e)
        {
          
      for (int jj = 0; Timer_unbearbeitet.Count <= Timer_unbearbeitet.Count; jj++)
                {
                    if (Timer_unbearbeitet.Count == jj + 1)
                    {
                        break;
                    }
                    else
                    {
                        if (Timer_unbearbeitet[jj] == Timer_unbearbeitet[jj + 1])
                        {
                        
                            Timer_unbearbeitet.RemoveAt(jj);
                        }
                    }
                }
        }

Der Code funktioniert, nur ab und zu stürzt dieser ab.. weil die if-Anwendung (break) nicht erreicht wird.

Wo ist der Fehler? weil manchmal funktioniert der Code, manchmal nicht
 

knappenboy

Mitglied
Hey,

es werden mittels der Kinect 2 Daten aufgenommen.. und ein Timer gestartet. Startet die Kinect, dann startet der Timer, dann werden die Sekunden (in 0,1 s) des Timers in einer Liste hinzugefügt. Die Liste sieht z.B. so aus:

List Timer_unbearbeitet = (0.1,0.1,0.1,0.2,0.2,0.3,0.4,0.4, usw.)

nach der obigen Funktion soll dann nur noch da stehen (0.1,0.2,0.3,0.4,usw.)
 

sheel

I love Asm
Grund für den Fehler zuerst:
Angenommen die letzten zwei Werte (Indexe zB. 6 und 7) sind gleich. Count ist klarerweise 8.
Man ist also gerade am Anfang vom Schleifeninhalt, jj ist 6.
a) Timer_unbearbeitet.Count==jj+1 ist falsch (8!=7)
b) Timer_unbearbeitet[jj]==Timer_unbearbeitet[jj+1] ist wahr, Index [6] wird gelöscht. Der Wert von [7] "rutscht" auf [6], und Count geht von 8 runter auf 7.
c) Jetzt greift das jj++ der Schleife, jj ist jetzt 7
d) Nächster Durchgang: Timer_unbearbeitet.Count==jj+1 ist wieder falsch weil 7!=8 ...
Im nächsten If wird auf die Indexe 7 und 8 zugegriffen (jj ist ja 7), dabei gehts nur noch bis 6.

Das == durch <= ersetzen wäre eine mögliche Abhilfe, aber etwas mehr aufgeräumt und effizienter gemacht könnte es so ausschauen:
C#:
for (int jj = Timer_unbearbeitet.Count - 1; jj > 0; jj--)
{
    if (Timer_unbearbeitet[jj] == Timer_unbearbeitet[jj - 1])
        Timer_unbearbeitet.RemoveAt(jj);
}