繁体   English   中英

C# 遍历 NameValueCollection

[英]C# Iterate through 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);

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

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

前:

测试 -> [Val],

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

测试 3 -> [Val1],

测试 4 -> [Val4]

后:

测试 -> Val,

测试 2 -> Val1,

测试 2 -> Val1,

测试 2 -> Val2,

测试 3 -> Val1,

测试 4 -> Val4

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

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

这里没有什么新东西(@Julian 的 +1 由我回答在功能上是等效的),请大家继续前进。


在相关问题的答案中,我有一个 [overkill for this case but possible related ] 扩展方法集,它可以让您执行以下操作:

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

我认为这更简单: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));
}

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

(需要 [only] .NET 2.0 或更高版本)

var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
    string key = (string)enu.Current;
    string value = myNameValueCollection[key];
}

OR 当键可以为空时:

for (int i = 0; i < myNameValueCollection.Count; i++)
{
    string key = myNameValueCollection.GetKey(i);
    string value = myNameValueCollection.Get(i);
}
for (int i = 0; i < nvc.Count; i++) {
    System.Console.WriteLine(

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM