foreach KeyValuePair dans NameValueCollection?

J’ai ce code:

NameValueCollection nv = HttpUtility.ParseQuerySsortingng(querySsortingng); foreach (KeyValuePair pr in nv) { //process KeyValuePair } 

Cela comstack, mais quand j’essaye de l’exécuter, je reçois une InvalidCastException .

Pourquoi est-ce? Pourquoi ne puis-je pas utiliser KeyValuePair pour parcourir une NameValueCollection et que dois-je utiliser à la place?

Tout d’abord, NameValueCollection n’utilise pas KeyValuePair . En outre, foreach expose uniquement la clé:

 NameValueCollection nv = HttpUtility.ParseQuerySsortingng(querySsortingng); foreach (ssortingng key in nv) { var value = nv[key]; } 

Vous ne pouvez pas le faire directement, mais vous pouvez créer une méthode d’extension comme ceci:

 public static IEnumerable> AsKVP( this NameValueCollection source ) { return source.AllKeys.SelectMany( source.GetValues, (k, v) => new KeyValuePair(k, v)); } 

Ensuite, vous pouvez faire:

 NameValueCollection nv = HttpUtility.ParseQuerySsortingng(querySsortingng); foreach (KeyValuePair pr in nv.AsKVP()) { //process KeyValuePair } 

Note: inspiré par ceci . SelectMany est requirejs pour gérer les clés en double.

Version vb.net:

  Public Function AsKVP( source As Specialized.NameValueCollection ) As IEnumerable(Of KeyValuePair(Of Ssortingng, Ssortingng)) Dim result = source.AllKeys.SelectMany( AddressOf source.GetValues, Function(k, v) New KeyValuePair(Of Ssortingng, Ssortingng)(k, v)) Return result End Function 

Pour référence ultérieure, vous pouvez également utiliser cette syntaxe:

 foreach(ssortingng key in Request.QuerySsortingng) { var value = Request.QuerySsortingng[key]; } 

Autre méthode d’extension, à des fins d’apprentissage:

  public static IEnumerable> ToIEnumerable(this NameValueCollection nvc) { foreach (ssortingng key in nvc.AllKeys) { yield return new KeyValuePair(key, nvc[key]); } } 

NameValueCollection utilise l’énumérateur old-skool:

  var enu = ConfigurationManager.AppSettings.GetEnumerator(); while(enu.MoveNext()) { ssortingng key = (ssortingng)enu.Current; ssortingng value = ConfigurationManager.AppSettings[key]; } 

J’ai aimé ça et ça marche:

  foreach (ssortingng akey in request.Query.Keys.Cast()) writer.WriteLine(akey + " = " + request.Query[akey]); 

Sachez que le nom de la clé peut apparaître plusieurs fois dans la chaîne de requête et que la comparaison est généralement sensible à la casse.
Si vous voulez simplement obtenir la valeur de la première clé correspondante et ne pas vous soucier de la casse, utilisez ceci:

  public ssortingng GetQueryValue(ssortingng queryKey) { foreach (ssortingng key in QueryItems) { if(queryKey.Equals(key, SsortingngComparison.OrdinalIgnoreCase)) return QueryItems.GetValues(key).First(); // There might be multiple keys of the same name, but just return the first match } return null; } 
 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