在NameValueCollection中使用KeyValuePair?

Oli*_*ver 76 c#

我有这个代码:

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);        
foreach (KeyValuePair<String,String> pr in nv) {
    //process KeyValuePair          
}
Run Code Online (Sandbox Code Playgroud)

这编译,但当我尝试运行它我得到一个InvalidCastException.

为什么是这样?为什么我不能KeyValuePair用来迭代a NameValueCollection,我应该用什么呢?

jga*_*fin 124

首先,NameValueCollection不使用KeyValuePair<String,String>.此外,foreach只暴露密钥:

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);        
foreach (string key in nv) {
    var value = nv[key];

}
Run Code Online (Sandbox Code Playgroud)

  • 当我们开始使用NVC时,我们都会这样做. (25认同)
  • 请注意此代码如何用于重复键.当存在重复键时,它将返回"键值1,值2,值3",而不是"键值1",然后是"键值2",然后是"键值3". (7认同)
  • 嗯,那有点奇怪.我本来期望有办法同时获得两者. (3认同)
  • @Nick:NameValueCollection是.NET中的第一个集合类型之一.它不区分大小写并合并现有值(这对某些协议很有用) (3认同)

End*_*ono 11

你不能直接这样做,但你可以像这样创建一个扩展方法:

public static IEnumerable<KeyValuePair<string, string>> AsKVP(
        this NameValueCollection source
)
{
    return source.AllKeys.SelectMany(
        source.GetValues,
        (k, v) => new KeyValuePair<string, string>(k, v));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv.AsKVP()) {
    //process KeyValuePair          
}
Run Code Online (Sandbox Code Playgroud)

注:灵感来自.SelectMany需要处理重复的键.

vb.net版本:

<Extension>
Public Function AsKVP(
        source As Specialized.NameValueCollection
) As IEnumerable(Of KeyValuePair(Of String, String))
    Dim result = source.AllKeys.SelectMany(
        AddressOf source.GetValues,
        Function(k, v) New KeyValuePair(Of String, String)(k, v))
    Return result
End Function
Run Code Online (Sandbox Code Playgroud)


小智 10

为了将来参考,您还可以使用以下语法:

foreach(string key in Request.QueryString)
{
    var value = Request.QueryString[key];
}
Run Code Online (Sandbox Code Playgroud)

  • 好.如果您可以访问`HttpRequest`,则可以跳过`AllKeys`,因为`QueryString`属性是`NameValueCollection`. (2认同)

Adr*_*iro 6

另一种扩展方法,用于学习目的:

    public static IEnumerable<KeyValuePair<string, string>> ToIEnumerable(this NameValueCollection nvc)
    {
        foreach (string key in nvc.AllKeys)
        {
            yield return new KeyValuePair<string, string>(key, nvc[key]);
        }
    }
Run Code Online (Sandbox Code Playgroud)