C # Итерирование по NameValueCollection - PullRequest
70 голосов
/ 21 февраля 2011

У меня есть NameValueCollection, и я хочу перебрать значения.В настоящее время я делаю это, но, похоже, должен быть более аккуратный способ сделать это:

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();

Есть ли?

Ответы [ 7 ]

92 голосов
/ 21 февраля 2011

Вы можете сгладить коллекцию с помощью Linq, но это все еще цикл foreach, но теперь более неявный.

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);

Первая строка преобразует вложенную коллекцию в (не вложенную) коллекцию анонимных объектов со свойствами key и value .

Это выглядит так, как будто теперь это ключ сопоставления -> значение вместо key -> коллекция значений . Пример данных:

До:

Тест -> [Val],

Test2 -> [Val1, Val1, Val2],

Test3 -> [Val1],

Test4 -> [Val4]

После:

Тест -> Val,

Test2 -> Val1,

Test2 -> Val1,

Test2 -> Val2,

Test3 -> Val1,

Test4 -> Val4

76 голосов
/ 21 февраля 2011

Вы можете использовать ключ для поиска вместо двух циклов:

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}
3 голосов
/ 03 октября 2012

Ничего нового здесь не видно (ответ @ 1 Джулиана от меня функционально эквивалентен), вы все будете двигаться вперед, пожалуйста.


У меня есть [перебор для этого случая, но, возможно, соответствующий] набор методов расширения в ответе на связанный вопрос , который позволил бы вам сделать:

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);
1 голос
/ 21 февраля 2011

Единственный способ избежать вложенных циклов - использовать дополнительный список для хранения значений:

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);

(требуется [только] .NET 2.0 или более поздняя версия)

0 голосов
/ 03 июня 2019
var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
    string key = (string)enu.Current;
    string value = myNameValueCollection[key];
}

ИЛИ когда ключи обнуляются:

for (int i = 0; i < myNameValueCollection.Count; i++)
{
    string key = myNameValueCollection.GetKey(i);
    string value = myNameValueCollection.Get(i);
}
0 голосов
/ 17 декабря 2017

Я думаю, что это проще:

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 голосов
/ 21 февраля 2011
foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

Это вернет вам все ключи и соответствующие значения.

...