Search code examples
c#.netdictionarynamevaluecollection

Copy key values from NameValueCollection to Generic Dictionary


Trying to copy values from an existing NameValueCollection object to a Dictionary. I have the following code below to do that but seems the Add does not accept that my keys and values are as Strings

IDictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();
public void copyFromNameValueCollection (NameValueCollection a)
{
    foreach (var k in a.AllKeys)
    { 
        dict.Add(k, a[k]);
    }  
}

Note: NameValueCollection contains String keys and values and so I simply want to provide here a method to allow copying of those to a generic dictionary.


Solution

  • It doesn't make sense to use generics here since you can't assign strings to some arbitrary generic type:

    IDictionary<string, string> dict = new Dictionary<string, string>();
    
    public void copyFrom(NameValueCollection a)
    {
                foreach (var k in a.AllKeys)
                { 
                    dict.Add(k, a[k]);
                }  
    }
    

    although you should probably create a method to create a new dictionary instead:

    public static IDictionary<string, string> ToDictionary(this NameValueCollection col)
    {
        IDictionary<string, string> dict = new Dictionary<string, string>();
        foreach (var k in col.AllKeys)
        { 
            dict.Add(k, col[k]);
        }  
        return dict;
    }
    

    which you can use like:

    NameValueCollection nvc = //
    var dictionary = nvc.ToDictionary();
    

    If you want a general way of converting the strings in the collection into the required key/value types, you can use type converters:

    public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this NameValueCollection col)
    {
        var dict = new Dictionary<TKey, TValue>();
        var keyConverter = TypeDescriptor.GetConverter(typeof(TKey));
        var valueConverter = TypeDescriptor.GetConverter(typeof(TValue));
    
        foreach(string name in col)
        {
            TKey key = (TKey)keyConverter.ConvertFromString(name);
            TValue value = (TValue)valueConverter.ConvertFromString(col[name]);
            dict.Add(key, value);
        }
    
        return dict;
    }