C#迭代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(); 

在那儿?

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

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

它现在是一个映射键 – >值而不是键 – >值集合的方式平坦。 示例数据:

之前:

testing – > [Val],

testing2→[Val1,Val1,Val2],

Test3 – > [Val1],

Test4 – > [Val4]

后:

testing – > Val,

testing2 – > Val1,

testing2 – > Val1,

testing2 – > Val2,

Test3 – > Val1,

Test4 – > Val4

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

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

这里没有什么新东西(@朱利安+我的回答在function上是相同的),你们都请你们走。


我对这个案例有一个[矫枉过正,但可能是相关的]一组扩展方法, 在一个相关的问题的答案 ,这将允许你做:

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

我发现避免嵌套循环的唯一方法是使用额外的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或更高版本)

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

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