J'ai un NameValueCollection
et je veux parcourir les valeurs. Actuellement, je le fais, mais il semble qu'il devrait y avoir une façon plus ordonnée de le faire:
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();
Y a-t-il?
Vous pouvez aplatir la collection avec Linq, mais il s'agit toujours d'une boucle foreach
mais maintenant plus implicite.
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);
La première ligne convertit la collection imbriquée en une collection (non imbriquée) d'objets anonymes avec les propriétés clé et valeur .
C'est aplati de la même manière que c'est maintenant un mappage clé -> valeur au lieu de clé -> collection de valeurs . Les données d'exemple:
Avant:
Test -> [Val],
Test2 -> [Val1, Val1, Val2],
Test3 -> [Val1],
Test4 -> [Val4]
Après:
Test -> Val,
Test2 -> Val1,
Test2 -> Val1,
Test2 -> Val2,
Test3 -> Val1,
Test4 -> Val4
Vous pouvez utiliser la clé pour la recherche au lieu d'avoir deux boucles:
foreach (string key in nvc)
{
Console.WriteLine("{0} {1}", key, nvc[key]);
}
Rien de nouveau à voir ici (@ Julian's + 1 de moi la réponse est fonctionnellement équivalente), allez-y, allez-y s'il vous plaît.
J'ai un ensemble de méthodes d'extension [excessif pour ce cas mais éventuellement pertinent] dans une réponse à une question connexe , qui vous permettrait de:
foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
Console.WriteLine("{0} {1}", item.key, item.value);
La seule façon pour moi d'éviter les boucles imbriquées consiste à utiliser une liste supplémentaire pour stocker les valeurs:
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);
(Nécessite [seulement] .NET 2.0 ou version ultérieure)
Je pense que c'est plus simple:
For i As Integer = 0 To nvc.Count - 1
Console.Write("No", "Key", "Value")
Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next
var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
string key = (string)enu.Current;
string value = myNameValueCollection[key];
}
OU lorsque les clés peuvent être annulées:
for (int i = 0; i < myNameValueCollection.Count; i++)
{
string key = myNameValueCollection.GetKey(i);
string value = myNameValueCollection.Get(i);
}