C#通过NameValueCollection迭代

Pau*_*els 71 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();
Run Code Online (Sandbox Code Playgroud)

在那儿?

Jul*_*ian 96

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

之前:

测试 - > [Val],

Test2 - > [Val1,Val1,Val2],

测试3 - > [Val1],

Test4 - > [Val4]

后:

测试 - > Val,

Test2 - > Val1,

Test2 - > Val1,

Test2 - > Val2,

Test3 - > Val1,

Test4 - > Val4

  • 测试并使用`using System.Linq;` (3认同)
  • 如果有人想知道vb.net语法:`Dim items = nvc.AllKeys.SelectMany(AddressOf col.GetValues,Function(k,v)New With {.key = k,.value = v})` (3认同)
  • @EndyTjahjono轻微错字,将"col"更改为"nvp",因此它变为`Dim items = nvc.AllKeys.SelectMany(AddressOf nvp.GetValues,Function(k,v)New With {.key = k,.value = v} )` (2认同)

Fre*_*örk 78

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

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果存在具有多个值的任何键,则其行为将与OP的代码不同.您的代码将输出*"key value1,value2,value3"*,而OP的代码将输出*"key value1"*然后*"key value2"*然后*"key value3"*. (18认同)