Wie unterscheidet sich die ILookup<key, value>
Schnittstelle von IDictionary<key, value>
?
Ich verstehe nicht, wofür die ILookup
Schnittstelle gedacht ist.
Wie unterscheidet sich die ILookup<key, value>
Schnittstelle von IDictionary<key, value>
?
Ich verstehe nicht, wofür die ILookup
Schnittstelle gedacht ist.
Antworten:
ILookup
Einträge können mehrere Elemente pro Schlüssel enthalten - jeder Schlüssel ist einem zugeordnetIEnumerable<TElement>
.Wie in den Kommentaren angedeutet,
ILookup
ist an unveränderlich, während Sie Werte in a aktualisieren könnenIDictionary
(es stellt eineAdd()
Methode und einen Indexer bereit, mit denen Werte abgerufen und festgelegt werden können).Zusammenfassend ist ihr Anwendungsfall sehr unterschiedlich - Sie verwenden eine Suche, wenn Sie eine 1: N-Karte mit festen Werten benötigen, die sich nicht ändern (und nicht ändern können). Ein Wörterbuch hingegen bietet eine veränderbare 1: 1-Zuordnung von Schlüsselwertpaaren, sodass es aktualisiert werden kann, um Werte hinzuzufügen oder zu entfernen.
quelle
IEnumerable<T>
statt einesT
.ILookup<TElement>
ist keine Garantie für Unveränderlichkeit. Ihre Antwort scheint zu implizieren, dass es ist. Es bietet lediglich eine schreibgeschützte Ansicht einer Suche. AußerdemILookup<TElement>
hängt es von dieser Methode ab , wie eine Methode, die eine akzeptiert, mit der Änderung des Inhalts der Suche umgeht. Wenn keine Dokumentation vorhanden ist, ist es sicherer, eine Suche nicht zu mutieren, während Fremdcode noch auf sie verweist, und dies hängt von Ihrem Anwendungsfall ab. Sehen Sie sich die gesamte Diskussion darüber an, wie Menschen fälschlicherweise denken, dass die ImplementierungIReadOnlyList<T>
bedeuten sollte, dass eine Liste unveränderlich ist.ILookup<TKey, TElement>
ist eine schlechte Idee, wenn Sie vorhaben, sie zu mutieren. Wenn keine Dokumente vorhanden sind, sollten Sie davon ausgehen können, dass die Benutzeroberfläche eingehalten wird. Natürlich ist das wirkliche Leben chaotisch, aber wenn Sie eine Suche mit einer derToLookup
Erweiterungsmethoden erstellen , sollte davon ausgegangen werden können, dass sie nicht geändert wird. Es gibt Möglichkeiten, wie Sie es könnten, aber die Verbraucher IhrerILookup<TKey, TElement>
getippten Mitglieder sollten dem Prinzip des geringsten Erstaunens folgen. Wenn Sie feststellen, dass Ihnen eine übergeben wurde, die auf beobachtbare Weise mutiert ,throw
.Es ist viel einfacher als
IDictionary
. Es wird von Linq verwendet. Es hat nurContains
,Item
undCount
.IDictionary
hatAdd
,Remove
usw.quelle
IReadOnlyDictionary<TKey, TValue>
und alle Instanzen derDictionary<TKey, TValue>
Klasse implementieren sie (ToDictionary
gibt die Klasseninstanz zurück, damit sie auch funktioniert), sodass Sie jedes Wörterbuch als schreibgeschützt verfügbar machen können.