Autor Beitrag
r0xta
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 02.07.10 18:26 
Mahlzeit zusammen!

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

ausblenden 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:


ausblenden 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:
ausblenden 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


Zuletzt bearbeitet von r0xta am Sa 03.07.10 16:13, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
r0xta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Sa 03.07.10 16:32 
Das is egtl keine blöde Idee, die ich auch zuerst hatte:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Sa 03.07.10 16:55 
hab ich dich so richtig verstanden?

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Sa 03.07.10 18:24 
Super! Funktioniert!
Danke dir.
r0xta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: So 04.07.10 13:16 
Nur noch mal fürs Verständnis:
Weiß jemand warum das mit einer foreach-Schleife nicht funktioniert?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: r0xta