Remove-Methode bei mit Objekten befüllter ArrayList
-
Hallo Forum,
Hier ist ein Ausschnitt einer Verwaltung von Studentennamen und deren Matrikelnummern. Ist eine Aufgabe von der Uni, die wir lösen sollen. Es soll hinzufügen, lsöchen und sortieren können.
Nur leider funktioniert xxx.Remove(blabla) nicht mit Instanzen einer selbst erstellten Klasse. Scheint nur mit Standardtypen wie string und long zu funktionieren. Gibt es da einen Trick?
Gruß Franky
-
Entfernst du auch tatsächlich dasselbe Objekt dass du rein gepackt hast oder nur ne Kopie davon oder sowas?
(Je nach Situation kann es evtl. nötig sein IComparable<> beim Objekt dass du rein schmeißt zu implementieren)
-
Hier ist die Klasse:
class Studie : IComparable { private string nachName; private string vorName; private long matrNummer; public long MatrNummer { get { return this.matrNummer; } set { this.matrNummer = value; } } public string VorName { get { return this.vorName; } set { this.vorName = value; } } public string NachName { get { return this.nachName; } set { this.nachName = value; } } #region IComparable Member public int CompareTo(object obj) { string cmp = (string) ((Studie)obj).NachName; return this.NachName.CompareTo(cmp); } #endregion
Das Icomparable nutze ich zum Sortieren nach Nachnamen. Ist das vllt das Problem?
Der Benutezr bekommt einen Form präsentiert, in das er Nachname, Vorname und Matrikelnummer eingibt. Dies landet dann im ArrayList.
Zum Löschen bekommt er diesen Form erneut. Die Löschung solle erfolgen, wenn alle Angaben mit einer im ArrayList enthaltenen Instanz übereinstimmen.
Es ist also nicht exakt das Objekt, weil die Daten eben von diesem form kommen und in einem temporären Objekt landen, welches an xx.Remove übergeben wird. xx.Add funktioniert auf diese Weise, nur eben Remove nicht.
-
nachtrag:
Im Post sind unten aus Versehen die Klammern abgeschnitten. Die sind im Originalquellcode vorhanden und ganz sicher nicht das Problem.
-
Mach aus
class Studie : IComperable
folgendes
class Studie : IComperable<Studie>
und
public int CompareTo(object obj) { string cmp = (string) ((Studie)obj).NachName; return this.NachName.CompareTo(cmp); }
zu
public int CompareTo(Studie obj) { return this.Nachname.CompareTo(obj.Nachname); }
Das löschen eines Objekts in deinem ArrayList sollte ungefähr so aussehen
public void Loeschen() { string vorname = textBox1.Text; string nachname = textBox2.Text; string matrikelnummer = textBox3.Text; foreach(Studie s in MyArrayList) { if((s.Vorname == vorname) && (s.Nachname == nachname) && (s.Matrikelnummer == matrikelnummer)) { MyArrayList.Remove(s); } } }
Mfg
-
Mit IComparable habe ich mich vertan, aber in dem Falle könntest Du die Standard Equals()-Methode von "Studie" überschreiben. Ich glaube die wird von .Remove() benutzt, da steht bestimmt was in der msdn zu bei ArrayList.Remove()...
-
Das mit dem Inetrface hat nicht funktioniert. Drum habe ich es beim alten belassen. Aber die Löschen() funktioniert fast hervorragend. Nur bricht sie mit InvalidOperationException ab.
Habe es erstmal in try/catch gepackt, nur ganz wohl ist mir dabei nicht.
-
Das Problem wird sein, dass durch das .Remove() die MyArrayList verändert wird und dadurch das foreach kaputt geht
Das könnte man aber z.B. so umgehen:
for (int i=(MyArrayList.Count-1); i>=0; i--) { Studie s=MyArrayList[i]; if((s.Vorname == vorname) && (s.Nachname == nachname) && (s.Matrikelnummer == matrikelnummer)) { MyArrayList.RemoveAt(i); } }
-
Was haltet ihr denn von folgender Lösung, ich geh mal davon aus das die Matrikelnummer eindeutig ist.
var student = MyArrayList.ToList().Where(s => s.Matrikelnummer.Equals(matrikelnummer,StringComparison.InvariantCulturIgnoreCase).FirstOrDefault(); //wenn also einer gefunden wurde if(student != null) MyArrayList.Remove(student);