C#通过NameValueCollection迭代

时间:2011-02-21 12:30:35

标签: c# collections 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();

有吗?

8 个答案:

答案 0 :(得分:91)

你可以使用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 属性的匿名对象的(非嵌套)集合。

它现在是一个映射键 - >值而不是键 - >价值集合。示例数据:

之前:

  

测试 - > [Val],

     

Test2 - > [Val1,Val1,Val2],

     

Test3 - > [Val1],

     

Test4 - > [Val4]

之后:

  

测试 - > Val,

     

Test2 - > Val1,

     

Test2 - > Val1,

     

Test2 - > val2的,

     

Test3 - > Val1,

     

Test4 - > VAL4

答案 1 :(得分:76)

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

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}

答案 2 :(得分:3)

这里没有什么新东西(@ Julian的答案在我的答案中得到的功能相同),你们一起走吧。


我有一个[针对此案例但可能相关]的过度使用扩展方法in an answer to a related question,这可以让你这样做:

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);

答案 3 :(得分: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或更高版本)

答案 4 :(得分:0)

我认为这更简单:

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

for (int i = 0; i < nvc.Count; i++) {
    System.Console.WriteLine(

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

    );
}

答案 7 :(得分:-2)

foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

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