for- & foreach-Schleife für ein Listenfeld anwenden

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Azuie.

    for- & foreach-Schleife für ein Listenfeld anwenden

    Guten Morgen,

    derzeit erlerne ich die Grundlagen von C# im Selbststudium mit dem Buch "Einstieg in C# mit Visual Studio 2019".
    Bisher konnte ich mir das Meiste auch erklären - nun hänge ich jedoch bei einer Übung fest, bei der ich mir die Lösung nicht selbst erklären kann.
    Daher würde ich hier gerne um den ein oder anderen Tipp bitten, damit ich die Herangehensweise an das Problem verstehe.

    Die Übungsaufgabe ist die folgende:
    Es sollen zwei Listenfelder vorhanden sein, welche mittels zwei Buttons (links, rechts) in das jeweils andere Listenfeld übertragen werden können.
    Anschließend sollen die zuvor ausgewählten Elemente gelöscht werden.

    Entsprechend ist die Anwendung wie folgt gestaltet:


    Als Lösung ist der folgende Code angegeben:

    C#-Quellcode

    1. private void CmdRechtsVerschieben_Click(object sender, EventArgs e)
    2. {
    3. foreach (string s in LstLinks.SelectedItems)
    4. LstRechts.Items.Add(s);
    5. for (int i = LstLinks.SelectedItems.Count - 1; i >= 0; i--)
    6. LstLinks.Items.RemoveAt(LstLinks.SelectedIndices[i]);
    7. }


    Die foreach-Schleife kann ich mir selbst erklären, verstehe auch weshalb sie genutzt wird.
    Lediglich den Inhalt der for-Schleife kann ich nicht ganz nachvollziehen.

    Um mir den Inhalt zu erklären, habe ich versucht, mir die Schritte der Schleife zu notieren. Ich vermute, dass hier vielleicht der Denkfehler liegt.
    1. Zunächst wird i der Wert der ausgewählten Elemente zugewiesen (z.B. 2 für zwei ausgewählte Elemente)
    2. Anschließend wird dieser Wert um eins verringert, womit der Wert 1 entstehen dürfte
    3. Soferni >= 0; wird der Wert um eins verringert, somit dürfte der Wert 0 vorliegen
    4. Entsprechend wird für i der Wert 0 gesetzt?
    Und den Bereich LstLinks.SelectedIndices[i] verstehe ich dabei nicht wirklich.

    Ich würde mich über jede Art von Hinweis und Tipp freuen.

    Mit freundlichen Grüßen
    Willkommen im Forum.

    Es ist so:
    Man hat 5 Elemente gewählt -> Zeile#5 sagt: »For-Schleife, zähle von 4 bis 0, also setze für i nacheinander 4, 3, 2, 1, 0 ein.«
    Zeile #6: »Nachdem Du einen Wert für i gesetzt hast, nimm diesen Wert (anfangs z.B. 4), nimm ihn als Index für die Auflistung der selektierten Indices*, suche mir also den 5. selektierten Index raus und entferne an dieser Stelle den vorhandenen Listeneintrag.«

    * also nicht den selektierten Eintrag an sich, sondern dessen Position in der Liste

    Was bedeutet das jetzt? Du hast also 5 selektierte/ausgewählte Listeneinträge, und zwar. z.B. an Position 0, 3, 18, 4 und 1. (Ja, Du kannst ja wild rumselektieren. Aber in dieser Reihenfolge wurde es jetzt beispielsweise ausgewählt). Dadurch ergibt sich also die Auflistung der SelectedIndices: 0, 3, 18, 4, 1. In dieser Reihenfolge. Also selektierter Index 0 ist in dieser Reihenfolge an der 1. Stelle (Position 0), 3 an 2. Stelle (Pos1), 18 an 3. Stelle (Pos2), 4 an 4. Stelle (Pos3), 1 an 5. Stelle (Pos4). Die For-Schleife geht jetzt also mit i von 4 nach 0 und setzt dies in SelectedIndices ein. Dadurch erhältst Du für LstLinks.SelectedIndices[i]:
    • i = 4, LstLinks.SelectedIndices[i] = 1
    • i = 3, LstLinks.SelectedIndices[i] = 4
    • i = 2, LstLinks.SelectedIndices[i] = 18
    • i = 1, LstLinks.SelectedIndices[i] = 3
    • i = 0, LstLinks.SelectedIndices[i] = 0
    Und dann wird eben an diesen Stellen in der Liste der jeweilige Listeneintrag entfernt, also zuerst an Position 1, dann 4, 18, 3 und an Position 0.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.