2009-11-03 3 views
10

En recherchant comment convertir un NameValueCollection en une chaîne de requête, j'ai rencontré différentes méthodes. Je suis curieux de savoir si la syntaxe lambda plus courte est aussi efficace qu'elle pourrait l'être.Convertit un NameValueCollection en une chaîne de requête utilisant un C# lambda efficace?

How to convert NameValueCollection to a (Query) String en utilisant une fonction d'itération.

public static String ConstructQueryString(NameValueCollection parameters) 
{ 
    List<String> items = new List<String>(); 

    foreach (String name in parameters) 
     items.Add(String.Concat(name, "=", System.Web.HttpUtility.UrlEncode(parameters[name]))); 

    return String.Join("&", items.ToArray()); 
} 

Join a NameValueCollection into a querystring in C# utilise une expression lambda, qui a l'air bien, mais je ne suis pas sûr que ce soit un code efficace.

private static string JoinNvcToQs(NameValueCollection qs) 
{ 
    return string.Join("&", Array.ConvertAll(qs.AllKeys, key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(qs[key])))); 
} 

Répondre

2

Tout d'abord, la meilleure chose que vous pouvez faire est de tester et voir si la performance est acceptable pour votre application, nous pouvons vous dire des généralités sur les performances, mais à la fin il se résume à vos besoins et que vous connaître les réponses à cela. En ce qui concerne la question, à chaque fois que vous utilisez un délégué (ce qui est ce qu'un lambda crée) plutôt que d'exécuter le code directement, vous obtiendrez un coup de performance. Dans la plupart des cas, le hit est acceptable mais si ce code a besoin de la meilleure performance possible (disons dans une boucle interne), alors vous devez utiliser votre première méthode. Cela dit, si vous créez une chaîne de requête, vous êtes sur le point de toucher la base de données, ce qui prendra probablement beaucoup plus de temps que l'une ou l'autre méthode de création de la chaîne de requête en premier lieu.

11

je le ferais comme ceci:

public static string ConstructQueryString(NameValueCollection parameters) 
{ 
    var sb = new StringBuilder(); 

    foreach (String name in parameters) 
     sb.Append(String.Concat(name, "=", System.Web.HttpUtility.UrlEncode(parameters[name]), "&")); 

    if (sb.Length > 0) 
     return sb.ToString(0, sb.Length - 1); 

    return String.Empty; 
} 

De cette façon, vous créez moins d'objets (qui doivent être nettoyés par le garbage collector)

+0

Pour ceux (comme moi) qui a trébuché sur cela comme une méthode générale de générer l'URL à partir de NameValueCollection, cela ne fonctionne pas correctement pour les paramètres avec plusieurs valeurs. Astuce: boucle sur 'parameters.GetValues ​​(key)'. – mcNux

0

méthode de NameValueCollection ToString construira la chaîne de requête pour vous . Je n'ai pas fait d'analyse comparative, mais j'imagine que la mise en œuvre serait plus efficace que l'utilisation de lambdas ou de foreach.

(La solution ToString ne semble pas être bien documenté, je ne trouvais parce que this answer utilisé dans un exemple de code.)

Questions connexes