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})
如果它是一个空值怎么办?我如何得到add
string。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]

    );
}