ILookup-Schnittstelle vs IDictionary

Antworten:

111

ILookupEinträge können mehrere Elemente pro Schlüssel enthalten - jeder Schlüssel ist einem zugeordnet IEnumerable<TElement>.

Wie in den Kommentaren angedeutet, ILookupist an unveränderlich, während Sie Werte in a aktualisieren können IDictionary(es stellt eine Add()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.

Glassplitter
quelle
1
In der Tat ist jeder Eintrag ein IEnumerable<T>statt eines T.
Gabe
1
+1 Obwohl dies zutrifft, wäre es schön, mehr über Unterschiede in
Die Umsetzung 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ßerdem ILookup<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 Implementierung IReadOnlyList<T>bedeuten sollte, dass eine Liste unveränderlich ist.
Binki
1
@binki Das Aufdecken einer veränderlichen Implementierung von 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 der ToLookupErweiterungsmethoden 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 Ihrer ILookup<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.
Aluan Haddad
1
Grammatikfehler in meinem Kommentar: Ich meine, Ihre Verbraucher sollten davon ausgehen können, dass Sie dem Prinzip des geringsten Erstaunens gefolgt sind.
Aluan Haddad
4

Es ist viel einfacher als IDictionary. Es wird von Linq verwendet. Es hat nur Contains, Itemund Count. IDictionaryhat Add, Removeusw.

Daniel A. White
quelle
Meinen Sie damit, dass ILookup eine schreibgeschützte Teilmenge eines IDictionary ist?
Timothy Swan
1
Art von ... Aber jedes Element ist eine IGrouping, so dass es mehrere Elemente für einen Schlüssel geben kann, so dass es nicht gut zugeordnet wird. Es wäre schön gewesen, eine schreibgeschützte Schnittstelle zum Wörterbuch zu haben.
Philippe
2
@Philippe Die schreibgeschützte Schnittstelle zum Wörterbuch ist IReadOnlyDictionary<TKey, TValue>und alle Instanzen der Dictionary<TKey, TValue>Klasse implementieren sie ( ToDictionarygibt die Klasseninstanz zurück, damit sie auch funktioniert), sodass Sie jedes Wörterbuch als schreibgeschützt verfügbar machen können.
Los Frijoles
1
@LosFrijoles Danke, ich wusste nicht, dass es diesen gibt. Ich bin derzeit mit .NET 4.0 festgefahren und habe fälschlicherweise angenommen, dass es nicht existiert, ohne MSDN zu überprüfen.
Philippe