least cpu intensive Methode der Überprüfung, ob eine Liste in C # geändert hat

8

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)

    
Blam 02.09.2010, 19:44
quelle

6 Antworten

13

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.

    
Henk Holterman 02.09.2010, 19:47
quelle
19

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.

    
dthorpe 02.09.2010 19:52
quelle
5

Wenn Sie .NET 4.0 verwenden, können Sie die ObservableCollection-Klasse verwenden. (Vor 4.0 müssen Sie auf WPF verweisen).

Sobald Sie Ihre Liste erstellt haben, fügen Sie einfach einen Handler zum CollectionChanged-Ereignis hinzu.

    
Robaticus 02.09.2010 19:51
quelle
2

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%     
Ani 02.09.2010 19:55
quelle
1
  • Beschränken Sie den Zugriff auf die Liste.
  • Änderungen nur über eine vorgeschriebene API zulassen
  • Setzen Sie in dieser API ein Flag, wenn die ChangeList-Methode aufgerufen wird.
James Curran 02.09.2010 19:48
quelle
1

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.

    
NebuSoft 02.09.2010 19:49
quelle

Tags und Links