C#:将Dictionary<>转换为NameValueCollection

36

我如何将Dictionary<string, string>转换为NameValueCollection

我们项目中现有的功能返回一个老式的NameValueCollection,我用LINQ进行修改。结果应该作为NameValueCollection传递。

我想以一种通用的方式解决这个问题。有什么提示吗?

3个回答

44

为什么不使用一个简单的 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();

哈哈,差点忘了这个。感谢泛型! - 321X
1
这段代码可能会抛出 NullReferenceException,因为 kvp.Value 可能是 null。如果是这种情况,只需将 null 值添加到 NameValueCollection 中即可。 - Ronald

41

如果你喜欢LINQ:

将字典转换为NameValueCollection

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

NameValueCollection转换为Dictionary

(来源)

return source.Cast<string>()  
    .ToDictionary(s => s, s => source[s]);

更新--简化NVC->Dict(不需要中间选择...) - drzaus
整个早上一直在 Stack Overflow 上寻找这个答案。谢谢。 - scniro

6

试用这个词典扩展,希望它就是你想要的:

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()来更改此内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接