C#迭代NameValueCollection
我有一个C#迭代NameValueCollection,c#,collections,namevaluecollection,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("T
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();
有吗?您可以使用该键进行查找,而不是使用两个循环:
foreach (string key in nvc)
{
Console.WriteLine("{0} {1}", key, nvc[key]);
}
这将返回所有键和相应的值。我发现避免嵌套循环的唯一方法是使用附加列表存储值:
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);
List arrValues=new List();
对于(int i=0;i
(需要[only].NET 2.0或更高版本)您可以使用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);
第一行,将嵌套集合转换为具有属性键和值的匿名对象(非嵌套)集合
它现在是一个映射键->值,而不是键->值的集合。示例数据:
之前:
测试->[Val]
Test2->[Val1,Val1,Val2]
Test3->[Val1]
Test4->[Val4]
之后:
测试->Val
Test2->Val1
Test2->Val1
Test2->Val2
Test3->Val1
Test4->Val4
这里没有什么新的东西(我的回答是@Julian的+1'd在功能上是等效的),请大家继续前进
我有一套[对于这种情况来说是多余的,但可能是相关的]扩展方法,可以让您:
foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
Console.WriteLine("{0} {1}", item.key, item.value);
foreach(nvc.AsEnumerable().AsKeyValuePairs()中的KeyValuePair项)
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
或者当密钥可为空时:
for (int i = 0; i < myNameValueCollection.Count; i++)
{
string key = myNameValueCollection.GetKey(i);
string value = myNameValueCollection.Get(i);
}
for(int i=0;i
用于(int i=0;i
你所拥有的东西有什么问题?它本身没有什么问题-只是我认为我应该能够使用单个循环进行迭代。查看到目前为止的答案,如果可能存在重复的键值,这似乎是不可能的。这是正确的,但你可以使用不同的集合,例如字典
请参见否;它不会“t返回重复的值。这不是一个早于毫秒(哇!)的重复值吗?我个人会删除。@Slaks为了显得迂腐,它会给出重复的值,只是用逗号分隔。使用System.Linq;
测试并使用以防有人想知道vb.net语法:Dim items=nvc.AllKeys.SelectMany。”(AddressOf col.GetValues,Function(k,v)New With{.key=k,.value=v})
@EndyTjahjono轻微打字错误,将“col”改为“nvp”,使其成为Dim items=nvc.AllKeys.SelectMany(AddressOf nvp.GetValues,Function(k,v)New With{.key=k,.value=v})
如果它是一个空值怎么办?我如何得到addstring。empty
呢?请注意,如果有任何键具有多个值,这将与OP的代码的行为不同。您的代码将输出“key value1,value2,value3”,而OP的代码将输出“key value1”,然后是“key value2”,然后是“key value3”。(显然已被使用SelectMany
like所取代)@Ruben true,但我更愿意保留这一条,即使只是为了说明如何使用旧的.NET版本来实现这一点的历史价值。:)我遇到的SelectMany
的问题是,如果键的值为空,它就会失败。有什么办法吗?谢谢。@Si8到底失败了什么?理论上,只要抛出一个if
语句并检查null,尽管如果你的代码是一行代码,它会使它的可读性大大降低。你的方法可以使用null,但LINQ不能我刚才所说的…很抱歉不清楚。NameValueCollection没有一个可计算的或作为keyValuePairs@Luis泰勒兹。我知道。文本说我有一套扩展方法。它链接到它。正文文本表明这里没有什么新东西可看。这是澄清还是我需要重新解释?这是我见过的最糟糕的C#看到了。对不起,我想在vb.net中!更新了
for (int i = 0; i <= nvc.Count - 1; i++)
{
Console.Write("No", "Key", "Value");
Console.Write(i, nvc.GetKey(i), nvc.Get(i));
}
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);
}
for (int i = 0; i < nvc.Count; i++) {
System.Console.WriteLine(
nvc.AllKeys[i] + " = " + nvc[i]
);
}