Как я могу преобразовать Dictionary<string, string> в NameValueCollection?

Существующая функциональность нашего проекта возвращает старомодный NameValueCollection, который я модифицирую с помощью LINQ. Результат должен быть передан как NameValueCollection.

Я хочу решить эту проблему в общем виде. Какие-нибудь намеки?

35
321X 29 Авг 2011 в 16:56

3 ответа

Лучший ответ

Почему бы не использовать простой цикл foreach?

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

Это может быть встроено в метод расширения:

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

Тогда вы могли бы назвать это так:

var nameValueCollection = dict.ToNameValueCollection();
41
Daniel Hilgarth 23 Фев 2012 в 12:18

И если вам нравится LINQ:

Словарь для NameValueCollection

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

NameValueCollection в словарь

(исходный код)

return source.Cast<string>()  
    .ToDictionary(s => s, s => source[s]);
37
drzaus 10 Июл 2014 в 14:23

Попробуйте это расширение для словаря, надеюсь, это то, что вы хотели:

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

Использовать как

var nvc = myDict.ToNameValueCollection();

Примечание: я ограничил ключ строкой, потому что не хотел чрезмерно обобщать - конечно, вы можете изменить это с помощью универсального типа и .ToString () для ключа тоже.

5
Random Dev 29 Авг 2011 в 13:05