[c#] NameValueCollection의 foreach KeyValuePair?

이 코드가 있습니다.

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;
        }