我有一个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();
有吗?
答案 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]);
这将返回所有键和相应的值。