C#: Convert Dictionary<> to NameValueCollection
Asked Answered
G

3

37

How can I convert a Dictionary<string, string> to a NameValueCollection?

The existing functionality of our project returns an old-fashioned NameValueCollection which I modify with LINQ. The result should be passed on as a NameValueCollection.

I want to solve this in a generic way. Any hints?

Gudrin answered 29/8, 2011 at 12:56 Comment(0)
P
45

Why not use a simple foreach loop?

foreach(var kvp in dict)
{
    nameValueCollection.Add(kvp.Key.ToString(), kvp.Value.ToString());
}

This could be embedded into an extension method:

public static NameValueCollection ToNameValueCollection<TKey, TValue>(
    this IDictionary<TKey, TValue> dict)
{
    var nameValueCollection = new NameValueCollection();

    foreach(var kvp in dict)
    {
        string value = null;
        if(kvp.Value != null)
            value = kvp.Value.ToString();

        nameValueCollection.Add(kvp.Key.ToString(), value);
    }

    return nameValueCollection;
}

You could then call it like this:

var nameValueCollection = dict.ToNameValueCollection();
Presbytery answered 29/8, 2011 at 13:2 Comment(2)
Lol, forgot about this. Thank generics for this!Gudrin
This code can throw NullReferenceExceptions, because the kvp.Value could be null. If this is the case, just add the null value to the NameValueCollection.Ddt
B
42

And if you like LINQ:

Dictionary to NameValueCollection

return dictionary.Aggregate(new NameValueCollection(),
    (seed, current) => { 
        seed.Add(current.Key, current.Value);
        return seed;
    });

NameValueCollection to Dictionary

(source)

return source.Cast<string>()  
    .ToDictionary(s => s, s => source[s]);
Beesley answered 19/11, 2013 at 16:32 Comment(2)
updated -- simplified NVC->Dict (don't need intermediary select...)Beesley
Been hunting for this answer on SO all morning. Thank youHitchcock
V
6

try this Extension to Dictionary I hope it's what you wanted:

public static class DictionaryExtensions
{
    public static NameValueCollection ToNameValueCollection<tValue>(this IDictionary<string, tValue> dictionary)
    {
        var collection = new NameValueCollection();
        foreach(var pair in dictionary)
            collection.Add(pair.Key, pair.Value.ToString());
        return collection;
    }
}

use like

var nvc = myDict.ToNameValueCollection();

note: I have constrained the key to be string because I didn't want to overgeneralize - of course you can change this with a generic type and .ToString() for the key too.

Volkslied answered 29/8, 2011 at 13:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.