Es ist eine Kreuzung zwischen einem IGrouping
und einem Wörterbuch. Sie können Elemente nach einem Schlüssel gruppieren und dann über diesen Schlüssel auf effiziente Weise darauf zugreifen (anstatt nur über alle zu iterieren, was GroupBy
Sie tun können).
Sie könnten beispielsweise eine Menge .NET-Typen laden und eine Suche nach Namespace erstellen ... und dann ganz einfach zu allen Typen in einem bestimmten Namespace gelangen:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
public class Test
{
static void Main()
{
// Just types covering some different assemblies
Type[] sampleTypes = new[] { typeof(List<>), typeof(string),
typeof(Enumerable), typeof(XmlReader) };
// All the types in those assemblies
IEnumerable<Type> allTypes = sampleTypes.Select(t => t.Assembly)
.SelectMany(a => a.GetTypes());
// Grouped by namespace, but indexable
ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);
foreach (Type type in lookup["System"])
{
Console.WriteLine("{0}: {1}",
type.FullName, type.Assembly.GetName().Name);
}
}
}
(Normalerweise würde ich var
für die meisten dieser Deklarationen normalen Code verwenden.)
Lookup<,>
ist einfach eine unveränderliche Sammlung (ohneAdd
Methode für z. B.), die nur begrenzt verwendet werden kann. Darüber hinaus handelt es sich nicht um eine Allzweck-Sammlung in dem Sinne, dass Sie beim Nachschlagen eines nicht vorhandenen Schlüssels eher eine leere Sequenz als eine Ausnahme erhalten, was nur in speziellen Kontexten von Bedeutung ist, z. B. mit linq. Dies passt gut zu der Tatsache, dass MS keinen öffentlichen Konstruktor für die Klasse bereitgestellt hat.Eine Möglichkeit, darüber nachzudenken, ist folgende:
Lookup<TKey, TElement>
ähneltDictionary<TKey, Collection<TElement>>
. Grundsätzlich kann eine Liste mit null oder mehr Elementen über denselben Schlüssel zurückgegeben werden.quelle
Eine Verwendung von
Lookup
könnte sein, a umzukehrenDictionary
.Angenommen, Sie haben ein Telefonbuch implementiert, das eine
Dictionary
Reihe von (eindeutigen) Namen als Schlüssel enthält, wobei jeder Name einer Telefonnummer zugeordnet ist. Zwei Personen mit unterschiedlichen Namen haben möglicherweise dieselbe Telefonnummer. Dies ist kein Problem für aDictionary
, das sich nicht darum kümmert, dass zwei Schlüssel demselben Wert entsprechen.Jetzt möchten Sie nachschlagen, wem eine bestimmte Telefonnummer gehört. Sie erstellen ein
Lookup
, indem Sie allesKeyValuePairs
von IhremDictionary
, aber rückwärts, mit dem Wert als Schlüssel und dem Schlüssel als Wert hinzufügen . Sie können jetzt eine Telefonnummer abfragen und eine Liste mit Namen aller Personen abrufen, deren Telefonnummer dies ist. Das Erstellen einesDictionary
mit denselben Daten würde Daten löschen (oder fehlschlagen, je nachdem, wie Sie es getan haben)bedeutet, dass der zweite Eintrag den ersten überschreibt - das Dokument wird nicht mehr aufgelistet.
Der Versuch, dieselben Daten auf etwas andere Weise zu schreiben:
würde eine Ausnahme in die zweite Zeile werfen, da Sie keinen
Add
Schlüssel finden können, der sich bereits in der befindetDictionary
.[Natürlich möchten Sie vielleicht eine andere einzelne Datenstruktur verwenden Lookups in beide Richtungen zu tun, usw. In diesem Beispiel bedeutet , dass Sie die regenerieren haben
Lookup
aus demDictionary
die letzteren ändert sich jedes Mal. Aber für einige Daten könnte es die richtige Lösung sein.]quelle
Ich habe es noch nicht erfolgreich verwendet, aber hier ist mein Ziel:
A
Lookup<TKey, TElement>
würde sich ziemlich ähnlich wie ein (relationaler) Datenbankindex für eine Tabelle ohne eine eindeutige Einschränkung verhalten. Verwenden Sie es an den gleichen Stellen, an denen Sie es auch verwenden würden.quelle
Ich denke, Sie könnten es so argumentieren: Stellen Sie sich vor, Sie erstellen eine Datenstruktur für den Inhalt eines Telefonbuchs. Sie möchten nach Nachname und dann nach Vorname eingeben. Die Verwendung eines Wörterbuchs wäre hier gefährlich, da viele Personen denselben Namen haben können. Ein Wörterbuch wird also immer höchstens einem einzelnen Wert zugeordnet.
Eine Suche wird möglicherweise mehreren Werten zugeordnet.
Lookup ["Smith"] ["John"] wird eine Sammlung mit einer Größe von einer Milliarde sein.
quelle
Lookup["Smith"]["John"]
?