Hi,
ich habe eine foreach-Schleife, die alle Elemente eines bestimmten Typs (in meinem Fall sind alle Elemente vom gleichen Typ) in einer array-List durchgeht und jeweils etwas ausliest.
SharpDevelop gibt mir aber immer folgende Meldung aus:
"Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."
(System.InvalidOperationException bei MoveNext())
Nun frage ich mich, wie beim Auslesen die ArrayList verändert werden kann.
Die ArrayList entsteht folgendermaßen:
Eine Datei wird nach und nach ausgelesen und in ein von mir selbst angelegtes struct geschrieben. Die structs werden jeweils der ArrayList angehängt.
Danach soll per foreach jedes Element durchgegangen werden und eine Variable des structs angezeigt werden.
Das funktioniert mit allen Dateien gut. Nur mit einer einzigen nicht. Wenn es aber an der Datei liegen würde, müsste aber doch schon ein Fehler beim erstellen der ArrayList auftreten (also beim Auslesen der Datei und schreiben der Werte ins ArrayList).
Der Fehler tritt aber erst beim Auslesen der ArrayList auf.
Und da wird definitiv nichts mehr geändert (was eine foreach-Schleife ja auch verbieten würde).
Hat einer eine Idee, was es genau mit diesem Fehler auf sich hat?
Zeig mal deinen Code zum auslesen.
Btw.: structs und ArrayList sind eher kontraproduktiv; verwende lieber Klassen.
Hallo kolli,
naja, ziemlich sicher änderst du die Auflistung oder eins ihrer Elemente eben doch.
herbivore
Ich habe genau das gleiche Problem, allerdings will ich das Array auslesen. foreach geht ja leider nicht, wie ich gerade lese. wie kann man denn auf einem String oder andere Elemente zugreifen?
PS: Diese Sprache ist echt merkwürdig. Hier geht ne menge nicht 😄 in PHP kann ich problemlos array mit unterschiedlichsten Informationen Füllen und auslesen.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// erweiterung
using System.Collections;
namespace array
{
class Program
{
static void Main(string[] args)
{
ArrayList arrayListe = new ArrayList(1);
arrayListe.Add(10);
arrayListe.Add("zehn");
foreach(int i in arrayListe)
Console.Write(i);
}
}
}
Hallo alpha_c,
foreach geht schon, wenn du die Auflistung bzw. Elemente davon nicht änderst. Reines Auslesen ist kein Problem. C# ist eine typisierte Sprachen. Daten müssen entsprechend gecastetet oder umgewandelt werden.
foreach(object o in arrayListe)
{
try
{
int n = (int)o; // Casting für Werttypen
Console.WriteLine(n);
continue;
}
catch( InvalidCastException e ) { }
string s = o as string; // Casting für Objekte
if( s != null )
{
Console.WriteLine(s);
continue;
}
// usw.
}
Gruß
wolpertinger
Seit .Net 2.0 verwendet man keine Arraylist mehr, da es nun die generische Liste 'List<T>' gibt. Die generische 'List<T>' bietet nicht nur performancevorteile, sondern auch typsicherheit. Bitte schau mal in der MSDN nach 'List<T>' um ein beispiel und dessen verwendung zu finden. Man macht sich auch beim Programmieren das leben leichter wenn man die 'List<T>' verwendet. Siehe auch List<T> statt ArrayList?