Entwickler-Ecke

Basistechnologien - Liste: Item ersetzen


r0xta - Fr 02.07.10 18:26
Titel: Liste: Item ersetzen
Mahlzeit zusammen!

Ich versuche verzweifelt ein Element in einer Liste zu ersetzen.
Dies war mein erster Ansatz:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  
public List<string> liste = new List<string>();

...

 private void wechsleElement()
    {
     
      foreach (string element in liste)
      {      
           liste.Replace(element, "bla");
       }
      }


...der allerdings nichts bewirkt.

Zweiter Ansatz:



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  
public List<string> liste = new List<string>();

...

 private void wechsleElement()
    {
     
      foreach (string element in liste)
      {      
            liste.Remove(element);
            liste.Insert(0"bla");
       }
      }


Bringt die Fehlermeldung:

Quelltext
1:
Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden                    


In einem C#2008 Buch hab ich nun gelesen Collection<T> wäre für solche Fälle (Löschen, Hinzufügen, Verändern...) besonders gut geeignet. Allerdings wird der Typ nicht gefunden? Kann es sein dass es diesen Typ unter .NET 4.0 nicht mehr gibt?

Dankbar für jede Hilfe damit ich ein Element in der Liste austauschen kann...


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 02.07.2010 um 18:30


Christian S. - Fr 02.07.10 18:33

Was ist bei Deinem ersten Ansatz denn "kategorie"? :lupe:

Ansonsten: Du kannst auf die Elemente einer List<T> zugreifen wie auf die Elemente eines Arrays. Damit ist das Ersetzen ganz einfach.

Collection<T> gibt es auch in .NET 4.0 noch. Es ist aber nur eine Basisklasse, von der andere Klassen abgeleitet werden. Am besten Mal die Doku dazu durchlesen, der Text dort ist recht ausführlich :-)


r0xta - Sa 03.07.10 16:19

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Was ist bei Deinem ersten Ansatz denn "kategorie"? :lupe:

tippfehler, sorry ;) habs korrigiert

hm... also wenn ich z. B. aus einem Array ein Item mit Array.Clear(meinArray, index, 0) löschen will, sollte das auch mit meiner Liste funktionieren?
Da sagt er bei mir aber liste.clear() entfernt alle Elemente.

Wenn ich mit liste.RemoveAt(index) arbeite, kommt wieder die Fehlermeldung "Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden"


Christian S. - Sa 03.07.10 16:21

Du willst ein Item ändern, dazu musst Du es doch nicht entfernen! Einfach neuen Wert zuweisen und fertig. :-)


r0xta - Sa 03.07.10 16:32

Das is egtl keine blöde Idee, die ich auch zuerst hatte:


C#-Quelltext
1:
2:
3:
4:
5:
    
 foreach (string element in liste)
   {      
      element = "neuer string";
   }


aber nachdem er da meckert:
"element" ist "foreach-Iterationsvariable", daher ist die Zuordnung nicht möglich.

hatte ich das recht schnell wieder verworfen...


Christian S. - Sa 03.07.10 16:35

Deswegen der Hinweis, dass Du zugreifen kannst, wie bei einem Array. Um es deutlicher zu machen: Du kannst ein Element direkt über den Index ansprechen!


r0xta - Sa 03.07.10 16:55

hab ich dich so richtig verstanden?


C#-Quelltext
1:
2:
3:
4:
5:
 
foreach (string element in liste)
 {      
    liste[index] = "neuer string";
 }


da kommt leider selbige Fehlermeldung...
"Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden"


Christian S. - Sa 03.07.10 17:08

Nimm 'ne "normale" for-Schleife, dann geht's.


r0xta - Sa 03.07.10 18:24

Super! Funktioniert!
Danke dir.


r0xta - So 04.07.10 13:16

Nur noch mal fürs Verständnis:
Weiß jemand warum das mit einer foreach-Schleife nicht funktioniert?


Th69 - So 04.07.10 14:19

Die Variable bei einer foreach-Schleife darf man nicht verändern (da dies evtl. unvorhersehbare Folgen hätte) - man darf also nur lesend auf diese Variable zugreifen.

Mit der Änderung der Schleifenvariable hättest du eben nur diese geändert, aber nicht den Wert in der Liste (diese Variable ist ja keine Referenz, sondern eine Kopie)!


jaenicke - So 04.07.10 14:24

user profile iconr0xta hat folgendes geschrieben Zum zitierten Posting springen:
"Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden"
Weil du dabei alle Elemente durchgehst. Wenn du jetzt aber die Liste der Elemente änderst, dann kannst du ja nicht mehr alle der aktuellen Liste durchgehen.

Und rein logisch: Du willst ja nichts mit den aktuellen Elementen der Liste machen (for each --> für jedes Element), sondern du willst etwas mit den Speicherstellen im Array machen.