С# Итерация через NameValueCollection
У меня есть 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();
Есть ли?
Ответы
Ответ 1
Вы можете сгладить коллекцию с помощью 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);
Первая строка преобразует вложенную коллекцию в (не вложенную) коллекцию анонимных объектов с ключом свойств и значением.
Он сглаживается таким образом, что теперь это ключ сопоставления → вместо ключа → набор значений. Данные примера:
До:
Тест → [Val],
Test2 → [Val1, Val1, Val2],
Test3 → [Val1],
Test4 → [Val4]
После:
Test → Val,
Test2 → Val1,
Test2 → Val1,
Test2 → Val2,
Test3 → Val1,
Test4 → Val4
Ответ 2
Вы можете использовать ключ для поиска вместо двух циклов:
foreach (string key in nvc)
{
Console.WriteLine("{0} {1}", key, nvc[key]);
}
Ответ 3
Ничего нового, чтобы увидеть здесь (@Julian + 1'd мной ответ функционально эквивалентен), y'all двигаться вдоль y'all, пожалуйста.
У меня есть [overkill для этого случая, но возможно релевантный] набор методов расширения в ответе на соответствующий вопрос, который позволит вам сделать:
foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
Console.WriteLine("{0} {1}", item.key, item.value);
Ответ 4
Единственный способ избежать вложенных циклов - использовать дополнительный список для хранения значений:
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 или новее)
Ответ 5
Я думаю, что это проще:
For i As Integer = 0 To nvc.Count - 1
Console.Write("No", "Key", "Value")
Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next
Ответ 6
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);
}
Ответ 7
foreach ( string key in nvc.Keys )
Console.WriteLine("{0} {1}", key, nvc[key]);
Это вернет вам все ключи и соответствующие значения.