[英]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);
第一行,将嵌套集合转换为具有属性key和value的匿名对象的(非嵌套)集合。
它现在是一个映射键 -> 值而不是键 -> 值集合。 示例数据:
前:
测试 -> [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.