77

我有一个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();

在那儿?

4

8 回答 8

107

您可以使用 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);

第一行,将嵌套集合转换为具有属性keyvalue的(非嵌套)匿名对象集合。

它的扁平化方式是它现在是映射key -> value而不是key -> collection of values。示例数据:

前:

测试 -> [Val],

测试 2 -> [Val1,Val1,Val2],

测试 3 -> [Val1],

测试4 -> [Val4]

后:

测试 -> 验证,

测试2-> Val1,

测试2-> Val1,

测试2-> Val2,

测试 3 -> Val1,

测试4-> Val4

于 2011-02-21T13:29:01.593 回答
87

您可以使用键进行查找,而不是使用两个循环:

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}
于 2011-02-21T12:34:54.307 回答
4

这里没有什么新鲜的东西(@Julian's +1'd by me answer is functionally equivalent),请大家继续前进。


在对相关问题的回答中,我有一个 [overkill 但可能相关的] 扩展方法集,可以让你这样做:

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);
于 2012-10-03T13:13:14.223 回答
2
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);
}
于 2019-06-03T16:15:52.120 回答
1

我发现避免嵌套循环的唯一方法是使用额外的 List 来存储值:

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 或更高版本)

于 2011-02-21T12:44:43.793 回答
1

我认为这更简单:VB.NET

For i As Integer = 0 To nvc.Count - 1
   Console.Write("No", "Key", "Value")
   Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next

C#:

for (int i = 0; i <= nvc.Count - 1; i++)
{
    Console.Write("No", "Key", "Value");
    Console.Write(i, nvc.GetKey(i), nvc.Get(i));
}
于 2017-12-17T11:27:05.663 回答
0
for (int i = 0; i < nvc.Count; i++) {
    System.Console.WriteLine(

        nvc.AllKeys[i] + " = " + nvc[i]

    );
}
于 2021-01-16T21:11:45.927 回答
-2
foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

这将返回您所有的键和相应的值。

于 2011-02-21T12:34:54.453 回答