C# Iterate through NameValueCollection

后端 未结 7 1789
慢半拍i
慢半拍i 2020-12-13 01:43

I have a NameValueCollection, and want to iterate through the values. Currently, I’m doing this, but it seems like there should be a neater way to do it:

相关标签:
7条回答
  • 2020-12-13 01:53
    foreach ( string key in nvc.Keys )
       Console.WriteLine("{0} {1}", key, nvc[key]);
    

    This will return you all keys and corresponding values.

    0 讨论(0)
  • 2020-12-13 01:55

    I think this is simpler:

    For i As Integer = 0 To nvc.Count - 1
       Console.Write("No", "Key", "Value")
       Console.Write(i, nvc.GetKey(i), nvc.Get(i))
    Next
    
    0 讨论(0)
  • 2020-12-13 02:04

    You can flatten the collection with Linq, but it's still a foreach loop but now more implicit.

    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);
    

    The first line, converts the nested collection to a (non-nested) collection of anonymous objects with the properties key and value.

    It's flatten in the way that it's now a mapping key -> value instead of key -> collection of values. The example data:

    Before:

    Test -> [Val],

    Test2 -> [Val1, Val1, Val2],

    Test3 -> [Val1],

    Test4 -> [Val4]

    After:

    Test -> Val,

    Test2 -> Val1,

    Test2 -> Val1,

    Test2 -> Val2,

    Test3 -> Val1,

    Test4 -> Val4

    0 讨论(0)
  • 2020-12-13 02:05

    Nothing new to see here (@Julian's +1'd by me answer is functionally equivalent), y'all move along y'all please.


    I have an [overkill for this case but possibly relevant] set of extension methods in an answer to a related question, which would let you do:

    foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
        Console.WriteLine("{0} {1}", item.key, item.value);
    
    0 讨论(0)
  • 2020-12-13 02:07

    The only way I found to avoid the nested loops is using additional List to store the values:

    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);
    

    (Requires [only] .NET 2.0 or later)

    0 讨论(0)
  • 2020-12-13 02:10

    You can use the key for lookup instead of having two loops:

    foreach (string key in nvc)
    {
        Console.WriteLine("{0} {1}", key, nvc[key]);
    }
    
    0 讨论(0)
提交回复
热议问题