Ich habe diesen Code:
NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv) {
//process KeyValuePair
}
Dies wird kompiliert, aber wenn ich versuche, es auszuführen, bekomme ich eine InvalidCastException
.
Warum ist das? Warum kann ich nicht KeyValuePair
über a iterieren NameValueCollection
und was soll ich stattdessen verwenden?
var nv = HttpUtility.ParseQueryString(Request.Url.Query); var qsDic = nv.Cast<object>().ToDictionary<object, string, object>(key => (string) key, key => nv[(string) key]);
Antworten:
Erstens
NameValueCollection
nicht verwendetKeyValuePair<String,String>
. Außerdem wirdforeach
nur der Schlüssel angezeigt:NameValueCollection nv = HttpUtility.ParseQueryString(queryString); foreach (string key in nv) { var value = nv[key]; }
quelle
KeyValuePair<String,String>
da die NameValueCollection nur Zeichenfolge, Zeichenfolge verwendet. Keine Notwendigkeit, es anzugeben.Sie können das nicht direkt tun, aber Sie können eine Erweiterungsmethode wie folgt erstellen:
public static IEnumerable<KeyValuePair<string, string>> AsKVP( this NameValueCollection source ) { return source.AllKeys.SelectMany( source.GetValues, (k, v) => new KeyValuePair<string, string>(k, v)); }
Dann können Sie tun:
NameValueCollection nv = HttpUtility.ParseQueryString(queryString); foreach (KeyValuePair<String,String> pr in nv.AsKVP()) { //process KeyValuePair }
Hinweis: inspiriert durch diese . SelectMany ist erforderlich, um doppelte Schlüssel zu verarbeiten.
vb.net Version:
<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
quelle
Zum späteren Nachschlagen können Sie auch diese Syntax verwenden:
foreach(string key in Request.QueryString) { var value = Request.QueryString[key]; }
quelle
HttpRequest
, können Sie überspringen,AllKeys
da dieQueryString
Eigenschaft eine istNameValueCollection
.AllKeys
wie @jgauffin erwähnt verwenden müssenjgauffin
die Antworten keine Duplikate, wenn Sie genauer hinschauen.Eine andere Erweiterungsmethode für Lernzwecke:
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]); } }
quelle
nvc
statt zu verwendennvc.AllKeys
. Ich frage mich, warum Microsoft-Leute dies nicht hinzugefügt habenSystem.Linq
. :)NameValueCollection verwendet den Old-Skool-Enumerator:
var enu = ConfigurationManager.AppSettings.GetEnumerator(); while(enu.MoveNext()) { string key = (string)enu.Current; string value = ConfigurationManager.AppSettings[key]; }
quelle
Mir hat das gefallen und es funktioniert:
foreach (string akey in request.Query.Keys.Cast<string>()) writer.WriteLine(akey + " = " + request.Query[akey]);
quelle
Beachten Sie, dass der Schlüsselname möglicherweise mehrmals in der Abfragezeichenfolge vorkommt und dass beim Vergleich normalerweise zwischen Groß- und Kleinschreibung unterschieden wird.
Wenn Sie nur den Wert des ersten passenden Schlüssels erhalten möchten und sich nicht um die Groß- und Kleinschreibung kümmern möchten, verwenden Sie Folgendes:
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; }
quelle
public static void PrintKeysAndValues2( NameValueCollection myCol ) { Console.WriteLine( " [INDEX] KEY VALUE" ); for ( int i = 0; i < myCol.Count; i++ ) Console.WriteLine( " [{0}] {1,-10} {2}", i, myCol.GetKey(i), myCol.Get(i) ); Console.WriteLine(); }
http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx
quelle
NameValueCollection
Daten möglich ist. Die Frage ist jedoch, warum Sie keineNameValueCollection
Elemente in konvertieren könnenKeyValuePair<string, string>
. Vielleicht haben Sie die Frage nicht sehr sorgfältig gelesen. Die beste Antwort wurde von gegebenjgauffin
. Eine interessante Lösung wurde von vorgeschlagenAdrian Carneiro
.