Hallo,
ich habe ein Problem bei der Verwendung einer Collection, bei der Duplikate ausgeschlossen werden sollen und die (de)serialisiert werden soll. Ich versuche das Ganze mal Step by Step zu erklären, ich hoffe es wird nicht zu unverständlich...
Also, ich brauche zunächst eine Liste, die ausschließlich Zeichenketten aufnehmen kann. Ich habe mich hier für die Vererbung von Collection(T) entschieden:
Die Klasse implementiert noch einige weitere Methoden, diese sind aber erstmal nicht weiter relevant.
Nun fülle ich die Liste und serialisiere sie in eine externe Datei:
Und da ich den Dateiinhalt bei einer späteren Programmnutzung wieder verarbeiten möchte, brauche ich natürlich noch eine Methode zur Deserialisierung:
Soweit so gut. Das Einlesen und Rausschreiben der Daten funktioniert genauso wie ich es mir vorstelle.
Das Problem ist nun, dass ich die Liste gern frei von Duplikaten halten möchte. Dazu habe ich eine neue Add-Methode in meiner StringList-Klasse implementiert:
Wenn ich nun die einzelnen Zeichenketten sozusagen "manuell" hinzufüge, funktioniert das natürlich einwandfrei.
Bei der Deserialisierung wird die Add-Methode dann jedoch nie aufrufen, da ja hier ein Cast stattfindet.
Und jetzt zu meiner Frage: Lassen sich die Duplikate trotzdem irgendwie filtern?
Mir ist jetzt so auf Anhieb keine clevere Lösung eingefallen, außer die Liste nach dem Einlesen zu durchlaufen und die gleichen Einträge per Hand zu entfernen, was aber bei einer relativ umfangreichen Liste nicht sehr effizient ist. Dürfte ein quadratisches Laufzeitverhalten sein.
Vielen Dank schonmal und viele Grüße
ich habe ein Problem bei der Verwendung einer Collection, bei der Duplikate ausgeschlossen werden sollen und die (de)serialisiert werden soll. Ich versuche das Ganze mal Step by Step zu erklären, ich hoffe es wird nicht zu unverständlich...
Also, ich brauche zunächst eine Liste, die ausschließlich Zeichenketten aufnehmen kann. Ich habe mich hier für die Vererbung von Collection(T) entschieden:
Code:
[Serializable()] public class StringList : Collection<string> { public override string ToString() { string[] array = new String[Count]; CopyTo(array, 0); return "[" + String.Join(",",array) + "]"; } }
Nun fülle ich die Liste und serialisiere sie in eine externe Datei:
Code:
public static void Main() { StringList sl = new StringList(); sl.Add("rot"); sl.Add("gelb"); sl.Add("gruen"); sl.Add("gruen"); Console.WriteLine(sl); SerializeObject(sl); } private static void SerializeObject(object obj) { try { FileStream stream = new FileStream("Ampel.dat", FileMode.Create); try { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, obj); } finally { stream.Close(); } } catch { } }
Code:
public static void Main() { object obj = DeserializeObject(); if (obj != null) { StringList sl = (StringList)obj; Console.WriteLine(sl); } else { Console.WriteLine("Fehler"); } } private static object DeserializeObject() { try { FileStream stream = new FileStream("Ampel.dat", FileMode.Open); try { BinaryFormatter formatter = new BinaryFormatter(); object obj = formatter.Deserialize(stream); return obj; } finally { stream.Close(); } } catch { return null; } }
Das Problem ist nun, dass ich die Liste gern frei von Duplikaten halten möchte. Dazu habe ich eine neue Add-Methode in meiner StringList-Klasse implementiert:
Code:
[Serializable()] public class StringList : Collection<string> { public new void Add(string item) { if (!Contains(item)) base.Add(item); } }
Bei der Deserialisierung wird die Add-Methode dann jedoch nie aufrufen, da ja hier ein Cast stattfindet.
Und jetzt zu meiner Frage: Lassen sich die Duplikate trotzdem irgendwie filtern?
Mir ist jetzt so auf Anhieb keine clevere Lösung eingefallen, außer die Liste nach dem Einlesen zu durchlaufen und die gleichen Einträge per Hand zu entfernen, was aber bei einer relativ umfangreichen Liste nicht sehr effizient ist. Dürfte ein quadratisches Laufzeitverhalten sein.
Vielen Dank schonmal und viele Grüße
Comment