2009-07-15 8 views
2

Nehmen wir an, ich habe eine List<NameValuePair>, wobei NameValuePair ein einfaches Objekt ist, das über eine Name-Eigenschaft und eine Value-Eigenschaft verfügt.Extrahieren von eindeutigen Schlüsseln aus Schlüssel/Wert-Paaren und Gruppieren der Werte in einem Array

Die Liste wird mit Werten wie folgt bestückt:

name = "name1", value = "value1" 
name = "name1", value = "value2" 
name = "name2", value = "value3" 
name = "name3", value = "value4" 

Hinweis, dass es zwei Instanzen des „name1“ -Taste. Es kann eine beliebige Anzahl von Schlüsseln geben (da dies eine Liste ist).

Ich möchte diese Liste in eine neue Liste, die nur eindeutige Schlüssel hat, und gruppiert alle Werte mit dem gleichen Schlüsselnamen wie ein Array/Liste dieses Schlüssels.

die oben sollte So werden:

name = "name1", value = "value1", "value2" // value is a string array or list 
name = "name2", value = "value3" 
name = "name3", value = "value4" 

Was ist der einfachste Weg dies zu erreichen?

Antwort

1

Vielleicht mit einem Wörterbuch < String, List <Zeichenkette> > können Sie etwas wie

 
for (var kv in mylistofnamed) { 
    if (!dict.ContainsKey(kv.Key)) 
     dict[kv.Key] = new List<string>(); 
    dict[kv.Key].Add(kv.Value); 
} 
tun?

+0

Das hat gut funktioniert. Nur zur Information, das Wörterbuch nach verarbeiten, ich foreach KeyValuePair verwenden musste: foreach (KeyValuePair > KVP in dict) { Console.WriteLine ("key" + dict.Key); Console.WriteLine ("Wert" + dict.Value); } – ObiWanKenobi

0

Eine Möglichkeit ist, mit einem Wörterbuch:

http://arcanecode.com/2007/03/05/dictionaries-in-c-the-hashtable/

Eine HashTable kann tun, was Sie mit eindeutigen Schlüssel benötigen. Sie müssen jedoch eine Liste als Wert angeben, da Sie mehrere Werte pro Schlüssel speichern.

Hier ist ein weiteres einfaches Beispiel:

http://dotnetperls.com/hashtable-keys

Sie müssen über jeden KeyValuePair in Ihrer Liste iterieren die HashTable zu füllen, indem Sie den Namen als Schlüssel und die Werte als Wert zu speichern. Da Sie möglicherweise einen Namen haben, der auf mehrere Werte verweist, benötigen Sie Ihre Werte in der HashTable als Listen.

Überprüfen Sie, ob der Name in der HashTable vorhanden ist. Wenn er nicht vorhanden ist, erstellen Sie eine neue Liste für diesen Namen, und fügen Sie den Wert zur Liste hinzu. Wenn der Schlüssel bereits vorhanden ist, greifen Sie auf dieses Element in der HashTable zu und fügen Sie den neuen Wert zur Liste hinzu, die dem Schlüssel zugeordnet ist.

7

Der einfachste Weg ist mit einer ILookup, die im Wesentlichen wie ein Wörterbuch ist, aber mehr als einen Wert für jede Taste haben kann.

Sie können etwas tun Ihr Nachschlag zu erstellen:

var lookup = list.ToLookup(pair => pair.name, 
          pair => pair.value); 

Dann könnten Sie den Namen/Wert-Paare wie folgt drucken:

foreach (var nameGroup in lookup) 
{ 
    var name = nameGroup.Key; 
    foreach (string value in nameGroup) 
     Console.WriteLine("Name: {0}, Value: {1}", name, value); 
} 
0

Alle Klassen, die die IDictionary-Schnittstelle oder die generische IDictionary-Schnittstelle implementieren, erzwingen Eindeutigkeitsprüfungen für die Schlüssel. Sie könnten jeden der Klassen verwenden, obwohl ich meine Präferenz für die generische Dictionary<TKey, TValue> Klasse gestehe.

Beim Hinzufügen von Werten können Sie einfach prüfen, ob das Dictionary-Objekt bereits den angegebenen Schlüssel enthält. Wenn nicht, können Sie das Element zum Wörterbuch hinzufügen.

1

Wenn Sie nur eine schreibgeschützte Sammlung benötigen, dann wird Lookup den Trick machen, wie in Meta-Knight's answer.

Wenn Sie die Sammlung nach der ersten Erstellung/Population ändern müssen, benötigen Sie wahrscheinlich etwas wie Dictionary<string, List<string>>. Sie können ein solches Wörterbuch aus Ihrer ursprünglichen Liste erstellen und mit LINQ füllen:

var dict = list 
    .GroupBy(x => x.Name) 
    .ToDictionary(x => x.Key, y => y.Select(z => z.Value).ToList()); 
Verwandte Themen