Ich habe eine NameValueCollection
und möchte die Werte durchlaufen. Momentan mache ich das, aber es scheint, als gäbe es einen besseren Weg, dies zu tun:
NameValueCollection nvc = new NameValueCollection();
nvc.Add("Test", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val2");
nvc.Add("Test3", "Val1");
nvc.Add("Test4", "Val4");
foreach (string s in nvc)
foreach (string v in nvc.GetValues(s))
Console.WriteLine("{0} {1}", s, v);
Console.ReadLine();
Gibt es?
c#
collections
namevaluecollection
Paul Michaels
quelle
quelle
Dictionary<string, List<string>>
Antworten:
Sie können die Sammlung mit Linq reduzieren, aber es ist immer noch eine
foreach
Schleife, aber jetzt impliziter.var items = nvc.AllKeys.SelectMany(nvc.GetValues, (k, v) => new {key = k, value = v}); foreach (var item in items) Console.WriteLine("{0} {1}", item.key, item.value);
Die erste Zeile, wandelt die verschachtelte Sammlung in eine (nicht-verschachtelte) Sammlung von anonymen Objekte mit den Eigenschaften Schlüssel und Wert .
Es ist so abgeflacht, dass es jetzt ein Zuordnungsschlüssel ist -> Wert anstelle von Schlüssel -> Sammlung von Werten . Die Beispieldaten:
Vor:
Nach:
quelle
using System.Linq;
Dim items = nvc.AllKeys.SelectMany(AddressOf col.GetValues, Function(k, v) New With {.key = k, .value = v})
Dim items = nvc.AllKeys.SelectMany(AddressOf nvp.GetValues, Function(k, v) New With {.key = k, .value = v})
v
einfach auf den Index des aktuellen Schlüssels verweisen?string.empty
? Wie kann ich stattdessen nur hinzufügen ?Sie können den Schlüssel für die Suche verwenden, anstatt zwei Schleifen zu haben:
foreach (string key in nvc) { Console.WriteLine("{0} {1}", key, nvc[key]); }
quelle
Hier gibt es nichts Neues zu sehen (@ Julians + 1 Antwort von mir ist funktional gleichwertig), Sie gehen bitte weiter.
Ich habe einen [Overkill für diesen Fall, aber möglicherweise relevanten] Satz von Erweiterungsmethoden in einer Antwort auf eine verwandte Frage , mit der Sie Folgendes tun können:
foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() ) Console.WriteLine("{0} {1}", item.key, item.value);
quelle
Die einzige Möglichkeit, die verschachtelten Schleifen zu vermeiden, besteht darin, zusätzliche Werte zum Speichern der Werte zu verwenden:
List<string> arrValues = new List<string>(); for (int i = 0; i < nvc.Count; i++) arrValues.AddRange(nvc.GetValues(i)); foreach (string value in arrValues) Console.WriteLine(value);
(Benötigt [nur] .NET 2.0 oder höher)
quelle
SelectMany
wie die andere Antwort )SelectMany
ich gestoßen bin, ist, wenn der Schlüssel einen Wert hat, der leer ist, schlägt er fehl. Irgendein Weg darum herum? Vielen Dank.if
Anweisung und prüfen Sie, ob sie null ist. Wenn Ihr Code jedoch einzeilig ist, wird er viel weniger lesbar.Ich denke das ist einfacher:
For i As Integer = 0 To nvc.Count - 1 Console.Write("No", "Key", "Value") Console.Write(i, nvc.GetKey(i), nvc.Get(i)) Next
quelle
var enu = myNameValueCollection.GetEnumerator(); while (enu.MoveNext()) { string key = (string)enu.Current; string value = myNameValueCollection[key]; }
ODER wenn Schlüssel nullbar sind:
for (int i = 0; i < myNameValueCollection.Count; i++) { string key = myNameValueCollection.GetKey(i); string value = myNameValueCollection.Get(i); }
quelle
foreach ( string key in nvc.Keys ) Console.WriteLine("{0} {1}", key, nvc[key]);
Dadurch erhalten Sie alle Schlüssel und die entsprechenden Werte zurück.
quelle