이 코드가 있습니다.
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv) {
//process KeyValuePair
}
이것은 컴파일되지만 실행하려고 할 때 InvalidCastException
.
왜 이런거야? KeyValuePair
을 반복 하는 데 사용할 수없는 이유는 NameValueCollection
무엇이며 대신 무엇을 사용해야합니까?
답변
우선, NameValueCollection
사용하지 않습니다 KeyValuePair<String,String>
. 또한 foreach
키만 노출합니다.
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (string key in nv) {
var value = nv[key];
}
답변
직접 할 수는 없지만 다음과 같이 확장 메서드를 만들 수 있습니다.
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
}
참고 : 이 . 중복 키를 처리하려면 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
답변
향후 참조를 위해 다음 구문을 사용할 수도 있습니다.
foreach(string key in Request.QueryString)
{
var value = Request.QueryString[key];
}
답변
학습 목적을위한 다른 확장 방법 :
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]);
}
}
답변
NameValueCollection은 old-skool 열거자를 사용합니다.
var enu = ConfigurationManager.AppSettings.GetEnumerator();
while(enu.MoveNext())
{
string key = (string)enu.Current;
string value = ConfigurationManager.AppSettings[key];
}
답변
나는 이것을 좋아했고 작동합니다.
foreach (string akey in request.Query.Keys.Cast<string>())
writer.WriteLine(akey + " = " + request.Query[akey]);
답변
키 이름은 쿼리 문자열에 두 번 이상 나타날 수 있으며 비교는 일반적으로 대소 문자를 구분합니다.
대소 문자를 신경 쓰지 않고 첫 번째 일치하는 키의 값을 얻으려면 다음을 사용하십시오.
public string GetQueryValue(string queryKey)
{
foreach (string key in QueryItems)
{
if(queryKey.Equals(key, StringComparison.OrdinalIgnoreCase))
return QueryItems.GetValues(key).First(); // There might be multiple keys of the same name, but just return the first match
}
return null;
}