我有这样的代码:
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv) {
//process KeyValuePair
}
这段代码可以编译,但是当我尝试运行它时,我得到了一个InvalidCastException
。
为什么会这样呢?为什么我不能使用KeyValuePair
遍历NameValueCollection
,我应该使用什么?
发布于 2011-12-05 21:02:42
首先,NameValueCollection
没有使用KeyValuePair<String,String>
。此外,foreach
仅公开密钥:
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (string key in nv) {
var value = nv[key];
}
发布于 2013-01-30 17:59:53
您不能直接这样做,但您可以创建一个扩展方法,如下所示:
public static IEnumerable<KeyValuePair<string, string>> AsKVP(
this NameValueCollection source
)
{
return source.AllKeys.SelectMany(
source.GetValues,
(k, v) => new KeyValuePair<string, string>(k, v));
}
然后您可以执行以下操作:
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv.AsKVP()) {
//process KeyValuePair
}
注:灵感来自this。需要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
发布于 2012-07-06 04:33:18
为了便于将来参考,您还可以使用以下语法:
foreach(string key in Request.QueryString)
{
var value = Request.QueryString[key];
}
https://stackoverflow.com/questions/8385677
复制相似问题