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%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.
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;)):
Eine kurze Erklärung des obigen Beispiels:
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.
Sie könnten ein Lookup<TKey, TElement>
verwenden:
Beachten Sie, dass diese Auflistung schreibgeschützt ist
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.
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%Tags und Links c# dictionary collections