Ich habe eine Funktion, die aufgerufen werden soll, wenn sich eine Liste seit dem letzten Aufruf geändert hat. Was wäre der beste Weg, dies zu implementieren?
ex:
%Vor%Ich hätte angenommen, eine Variable zu erstellen, um die alte Liste zu speichern und zu vergleichen, aber wie würde ich die alte Liste auf die neue Liste aktualisieren, ohne alles zu kopieren? (Wenn ich eine Zuweisung mache, wird auch die "alte Liste" aktualisiert)
Der effizienteste Weg wäre, das List<>
in Ihre eigene Klasse zu schreiben und alle mutierenden Methoden (Add, Remove) setzen ein boolesches Flag.
Ihre Methode kann dann nur auf diese Flagge schauen und sie zurücksetzen.
Verwenden Sie statt einer Liste eine ObservableCollection<T>
und abonnieren Sie dann die CollectionChanged
Veranstaltung.
Auf diese Weise werden Sie informiert, wenn die Liste geändert wird, anstatt die Daten zu scannen, um herauszufinden, was nach der Tat passiert ist.
Am besten wäre es, wenn Sie ObservableCollection<T>
oder BindingList<T>
verwenden, um eine Push-Benachrichtigung über eine Änderung zu erhalten. Sie könnten auch Collection<T>
ableiten, wenn Sie ein benutzerdefiniertes Verhalten wünschen.
Um Ihre Frage wie gewünscht zu beantworten (außer dem CPU-intensiven Bit), können Sie eine vorhandene Funktion von List<T>
verwenden: Sie behält ihre eigene Version intern bei, so dass sie geworfen werden kann, wenn sich die Sammlung während der Enumeration geändert hat / p>
Dies basiert auf der Analyse von Code aus dem Reflektor. Es ist nicht Teil eines Vertrags, daher kann es jederzeit brechen. Es funktioniert möglicherweise auch nicht in einer teilweise vertrauenswürdigen Umgebung. Bitte verwenden Sie mit Vorsicht:
%Vor%Versuchen Sie zu sehen, ob sich die Liste selbst geändert hat (Hinzufügen / Entfernen von Elementen) oder ob sich ein Element in der Liste geändert hat.
Wenn Sie nur sehen möchten, ob in einer Liste ein Element hinzugefügt / entfernt wurde, ist es am einfachsten, die Liste in eine neue Klasse zu verpacken und die Add / Remove-Methoden für Ihr Objekt zu überschreiben, um einen booleschen Wert auszulösen. p>
Die kompliziertere Anforderung besteht darin, dass Sie wissen müssen, ob sich ein in der Liste enthaltenes Element geändert hat (eine Eigenschaft oder ein Feld im Klassenobjekt, auf das in der Liste verwiesen wird). Wenn das der Fall ist, kommt es auf Ihre spezielle Situation an. Sie könnten dem Setter für die Eigenschaften dieser Klassen eine Möglichkeit geben, einen Boolean auszulösen, der dasselbe wie zuvor tun würde. Dies hängt jedoch von der Komplexität der Klasse in der generischen Liste ab.