Was ist der beste Sammlungstyp, um Werte mit mehreren identischen Schlüsseln leicht nachzuschlagen?

8

Ich habe text Dokumente wie die folgenden, die einzelne und mehrere Variablen enthalten:

%Vor%

Ich muss die Zeilen dieses Textdokuments durchlaufen und eine Sammlung mit diesen Variablen füllen, derzeit verwende ich ein Dictionary :

%Vor%

Aber das funktioniert nicht bei mehreren , identischen Schlüsseln wie "note" und "todo" im obigen Beispiel, da Schlüssel eindeutig sein müssen in einem Wörterbuch.

Was ist die beste Sammlung, damit ich nicht nur einzelne Werte wie folgt erhalten kann:

%Vor%

aber ich kann auch mehrere Werte wie folgt erhalten:

%Vor%     
Edward Tanguay 06.03.2010, 18:33
quelle

6 Antworten

7

Wenn Ihre Schlüssel und Werte Zeichenfolgen sind, verwenden Sie eine NameValueCollection . Es unterstützt mehrere Werte für einen bestimmten Schlüssel.

Es ist nicht die effizienteste Sammlung der Welt. Insbesondere weil es sich um eine nicht generische Klasse handelt, werden viele Aufrufe virtueller Methoden verwendet, und die GetValues-Methode weist Arrays für ihre Rückgabewerte zu. Aber solange Sie nicht die beste performing Sammlung benötigen, ist dies sicherlich die bequeme Sammlung, die das tut, was Sie fragen.

    
Josh 06.03.2010, 18:54
quelle
3

Sie können ein Dictionary für key erstellen: string und value: String-Liste

Dictionary<string,List<string>>

EDIT 1 & amp; 2:
Ich habe über eine bessere Lösung nachgedacht, wenn Sie .NET 3.0 oder höher verwenden können.
Hier ist ein LINQ-Beispiel (ich habe es ohne Visual Studio eingegeben, also hoffe ich, dass es kompiliert wird;)):

%Vor%

Eine kurze Erklärung des obigen Beispiels:

  • Alle Zeilen aus der Datei in einem String-Array abrufen
  • Definieren Sie einige Split-Optionen (um das Beispiel lesbar zu halten)
  • Teilen Sie sie für jede Zeile im Zeilen-Array auf "::"
  • Gruppieren Sie die Ergebnisse der Teilung für den ersten Split-Teil (z. B. Titel, Beschreibung, Notiz, ...)
  • Speichern Sie die gruppierten Elemente in der Elementvariablen

Das Ergebnis der LINQ-Abfrage ist ein IQueryable<IGrouping<string, IEnumberable<string>>> .
Jedes Element im Ergebnis hat eine Eigenschaft Key , die den Schlüssel der Zeile enthält (Titel, Beschreibung, Anmerkung, ...).
Jedes Element kann mit allen Werten aufgelistet werden.

    
Zyphrax 06.03.2010 18:37
quelle
2

Sie könnten ein Lookup<TKey, TElement> verwenden:

%Vor%

Beachten Sie, dass diese Auflistung schreibgeschützt ist

    
Thomas Levesque 06.03.2010 18:58
quelle
2

Sie können PowerCollections verwenden, ein Open Source-Projekt mit einer MultiDictionary-Datenstruktur, die Ihr Problem löst.

Hier ist ein Beispiel für die Verwendung .

Hinweis: Jon Skeet hat es zuvor in seiner Antwort auf diese Frage vorgeschlagen.

    
Sameh Deabes 06.03.2010 20:02
quelle
1

Ich bin kein c # Experte, aber ich denke Dictionary<string, List<string>>

oder irgendeine Art von HashMap<string, List<string>> könnte funktionieren. Zum Beispiel (Java Pseudocode): aKey aValue aKey anotherValue

%Vor%

oder etwas Ähnliches. (oder der kürzeste Weg:

%Vor%     
Tedil 06.03.2010 18:39
quelle
1

Ich habe Dictionary<string, HashSet<string>> verwendet, um mehrere Werte in der Vergangenheit zu erhalten. Ich würde gerne wissen, ob es etwas Besseres gibt.

Hier können Sie emulieren, wie Sie nur einen Wert erhalten.

%Vor%     
ChaosPandion 06.03.2010 18:38
quelle

Tags und Links