ObservableCollection <> vs. List <>

78

Ich habe viele Entitäten mit jeweils verschachtelten List<>.

Zum Beispiel habe ich BaseEntitywas hat List<ColumnEntity>. ColumnEntityKlasse hat List<Info>und so weiter.

Wir arbeiten mit einer WPF- Benutzeroberfläche und müssen alle Änderungen in jeder Liste von verfolgen BaseEntity. Es wird implementiert, indem a new ObservableCollectionbasierend auf der benötigten Liste instanziiert und daran gebunden wird ObservableCollection.

Was ändern sich die Vor- und Nachteile all diese verschachtelt Listszu ObservableCollections? So können wir alle Änderungen an BaseEntitysich verfolgen, ohne jede Liste einer BaseEntitygeänderten Bindung zuzuweisen ObservableCollection?

Angenommen, es Listwerden niemals spezifische Methoden verwendet.

Andriy Kizym
quelle

Antworten:

89

Interessante Frage, wenn man bedenkt, dass sowohl Liste als auch ObservableCollectionImplementierung IList<T>dort keinen großen Unterschied machen, ObservableCollectionimplementiert auch die INotifyCollectionChangedSchnittstelle, die es WPF ermöglicht, sich daran zu binden.

Einer der Hauptunterschiede besteht darin, dass ObservableCollectiones keine AddRangeMethode gibt, was einige Auswirkungen haben könnte.

Ich würde es auch nicht ObservableCollectionfür Orte verwenden, an denen ich weiß, dass ich nicht bindend bin. Aus diesem Grund ist es wichtig, Ihr Design zu überprüfen und sicherzustellen, dass Sie bei der Trennung der betroffenen Schichten den richtigen Ansatz wählen.

Was die Unterschiede zwischen Collection<T>und List<T>angeht, können Sie hier einen Blick auf Generische Listen vs. Sammlung werfen

Stan R.
quelle
2
Ich habe den Link repariert und die Änderung wurde genehmigt.
Joe
35

Es kommt darauf an, was Sie damit meinen:

Wir müssen alle Änderungen in jeder Liste von BaseEntity verfolgen

Wäre es ausreichend, Änderungen an Objekten zu verfolgen, die bereits in der Liste enthalten sind? Oder müssen Sie wissen, wann Objekte aus Positionen in der Liste entfernt / zu diesen hinzugefügt / geändert werden?

Wenn eine Liste während ihrer gesamten Lebensdauer dieselben Elemente enthält, sich jedoch die einzelnen Objekte in dieser Liste ändern, reicht es aus, wenn nur die Objekte Änderungsbenachrichtigungen auslösen (normalerweise bis INotifyPropertyChanged), und dies List<T>ist ausreichend. Wenn die Liste jedoch von Zeit zu Zeit unterschiedliche Objekte enthält oder sich die Reihenfolge ändert, sollten Sie verwenden ObservableCollection<T>.

Während die Unterschiede interessant sein mögen (und ein vorheriges Poster hat diese bereits behandelt), haben Sie normalerweise keine so große Auswahl - entweder Sie brauchen ObservableCollection<T>oder Sie tun es nicht.

Ian Griffiths
quelle
3
Schön durchdacht. +1
Subby
12

Liste stellt eine stark typisierte Liste von Objekten dar, auf die über den Index zugegriffen werden kann. Es bietet Methoden zum Suchen, Sortieren und Bearbeiten von Listen. Die List-Klasse ist das generische Äquivalent der ArrayList-Klasse. Es implementiert die generische IList-Schnittstelle mithilfe eines Arrays, dessen Größe nach Bedarf dynamisch erhöht wird.

ObservableCollection ist eine generische dynamische Datensammlung, die eine Schnittstelle "INotifyCollectionChanged" verwendet, um Benachrichtigungen bereitzustellen, wenn Elemente hinzugefügt, entfernt oder die gesamte Sammlung aktualisiert werden.

Lesen Sie mehr darüber in diesem Link: http://www.codeproject.com/Articles/42536/List-vs-ObservableCollection-vs-INotifyPropertyCha

Rayan Elmakki
quelle
10

Ein weiterer wichtiger Unterschied besteht darin, dass Sie auf ObservableCollection nur von einem Thread aus zugreifen können, für den es erstellt wurde, wobei auf die Liste von jedem Thread aus zugegriffen werden kann.

iaminvinicble
quelle
1
Unwahr. Sie können von jedem Thread aus auf beide zugreifen. Wenn ObservableCollection jedoch an ein ItemsControl gebunden ist und eine Änderung von einem nicht grafischen Thread ausgelöst wird, wird ein grafisches Objekt von einem nicht grafischen Thread geändert. Und es ist verboten -> Ausnahme
Emmanuel DURIN
6

Ich sehe kein Problem damit, abgesehen von einem sehr geringen Leistungsaufwand.

Beachten Sie, dass Sie nicht über Änderungen benachrichtigt werden, wenn Sie die internen Listen direkt ändern. Auch wenn die in der ObservableCollection enthaltenen Objekte geändert werden, werden Sie nicht benachrichtigt. Die Benachrichtigung erfolgt nur, wenn Elemente hinzugefügt, ersetzt, entfernt oder verschoben werden.

Codymanix
quelle