Autor |
Beitrag |
r0xta
      
Beiträge: 25
|
Verfasst: Fr 02.07.10 18:26
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 Christian S.: Topic aus C# - Die Sprache verschoben am Fr 02.07.2010 um 18:30
Zuletzt bearbeitet von r0xta am Sa 03.07.10 16:13, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 02.07.10 18:33
Was ist bei Deinem ersten Ansatz denn "kategorie"?
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 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
r0xta 
      
Beiträge: 25
|
Verfasst: Sa 03.07.10 16:19
Christian S. hat folgendes geschrieben : | Was ist bei Deinem ersten Ansatz denn "kategorie"?  |
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 03.07.10 16:21
Du willst ein Item ändern, dazu musst Du es doch nicht entfernen! Einfach neuen Wert zuweisen und fertig. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
r0xta 
      
Beiträge: 25
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
r0xta 
      
Beiträge: 25
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 03.07.10 17:08
Nimm 'ne "normale" for-Schleife, dann geht's.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Für diesen Beitrag haben gedankt: r0xta
|
|
r0xta 
      
Beiträge: 25
|
Verfasst: Sa 03.07.10 18:24
Super! Funktioniert!
Danke dir.
|
|
r0xta 
      
Beiträge: 25
|
Verfasst: So 04.07.10 13:16
Nur noch mal fürs Verständnis:
Weiß jemand warum das mit einer foreach-Schleife nicht funktioniert?
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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)!
Für diesen Beitrag haben gedankt: r0xta
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.07.10 14:24
r0xta hat folgendes geschrieben : | "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.
Für diesen Beitrag haben gedankt: r0xta
|
|