web-dev-qa-db-fra.com

C # Itérer via NameValueCollection

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?

69
Paul Michaels

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

91
Julian

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]);
}
75
Fredrik Mörk

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);
3
Ruben Bartelink

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)

1
Shadow Wizard

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
0
Hannington Mambo
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);
}
0
Dmitry Shashurov