我有这个代码:
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)
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)
另一种扩展方法,用于学习目的:
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)
归档时间: |
|
查看次数: |
79743 次 |
最近记录: |