Wie unterscheidet sich die ILookup<key, value>Schnittstelle von IDictionary<key, value>?
Ich verstehe nicht, wofür die ILookupSchnittstelle gedacht ist.
Wie unterscheidet sich die ILookup<key, value>Schnittstelle von IDictionary<key, value>?
Ich verstehe nicht, wofür die ILookupSchnittstelle gedacht ist.
Antworten:
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.
IEnumerable<T>statt eines T.
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.
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.
Es ist viel einfacher als IDictionary. Es wird von Linq verwendet. Es hat nur Contains, Itemund Count. IDictionaryhat Add, Removeusw.
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.