80 votes

foreach KeyValuePair dans NameValueCollection ?

J'ai ce code :

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);        
foreach (KeyValuePair<String,String> pr in nv) {
    //process KeyValuePair          
}

Cela compile, mais quand j'essaie de l'exécuter, j'obtiens une InvalidCastException .

Pourquoi ? Pourquoi je ne peux pas utiliser KeyValuePair pour itérer sur un NameValueCollection et que dois-je utiliser à la place ?

0 votes

J'aime cette méthode, car elle me permet d'initier un dictionnaire sans avoir à créer une variable de dictionnaire de secours en plus d'un foreach. var nv = HttpUtility.ParseQueryString(Request.Url.Query); var qsDic = nv.Cast<object>().ToDictionary<object, string, object>(key => (string) key, key => nv[(string) key]);

136voto

jgauffin Points 51913

Tout d'abord, NameValueCollection n'utilise pas KeyValuePair<String,String> . Aussi, foreach n'expose que la clé :

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);        
foreach (string key in nv) {
    var value = nv[key];

}

3 votes

Hmm, c'est un peu bizarre. Je me serais attendu à ce qu'il y ait un moyen d'obtenir les deux en même temps.

27 votes

Nous le faisons tous lorsque nous commençons à utiliser une CNV.

1 votes

Je me demandais comment faire... Merci ! En fait, vous n'avez pas besoin de spécifier KeyValuePair<String,String> car la collection NameValueCollection utilise uniquement string,string. Il n'est pas nécessaire de le préciser.

12voto

Endy Tjahjono Points 4458

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

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

Alors vous pouvez le faire :

NameValueCollection nv = HttpUtility.ParseQueryString(queryString);
foreach (KeyValuePair<String,String> pr in nv.AsKVP()) {
    //process KeyValuePair          
}

Note : inspiré par este . SelectMany est nécessaire pour gérer les clés dupliquées.

Version 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

10voto

Sebastien Morin Points 121

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

foreach(string key in Request.QueryString)
{
    var value = Request.QueryString[key];
}

2 votes

Eh bien. Si tu as accès au HttpRequest vous pouvez sauter AllKeys comme le QueryString est un NameValueCollection .

0 votes

-1 parce que vous n'avez pas besoin d'utiliser AllKeys comme l'a mentionné @jgauffin

0 votes

@Warlock : Donner un -1 pour ça est un peu dur. Vous pouvez modifier la réponse, n'est-ce pas ?

6voto

Adrian Carneiro Points 26652

Une autre méthode d'extension, à des fins d'apprentissage :

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

0 votes

Belle solution ! Je suggère simplement d'utiliser nvc au lieu de nvc.AllKeys . Je me demande pourquoi les gars de Microsoft n'ont pas ajouté cette fonctionnalité. System.Linq . :)

-1voto

whistlezl Points 1
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

0 votes

-1 Vous montrez qu'il est possible d'utiliser pour pour accéder à NameValueCollection données. Mais la question est de savoir pourquoi vous ne pouvez pas convertir NameValueCollection les articles à KeyValuePair<string, string> . Peut-être n'avez-vous pas lu la question très attentivement. La meilleure réponse a été donnée par jgauffin . Une solution intéressante a été proposée par Adrian Carneiro .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X