2009-11-03 29 views
10

在研究如何将NameValueCollection转换为查询字符串时,我遇到了不同的方法。我很好奇,如果更短的lambda语法是有效的,它可能是。正在使用c#lambda有效性将NameValueCollection转换为查询字符串?

How to convert NameValueCollection to a (Query) String使用迭代函数。

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#使用lambda表达式,这看起来不错,但我不知道这是否是有效的代码。

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

回答

2

首先,你能做的最好的事情是测试,看看性能为您的应用程序可以接受的,我们可以告诉你泛泛有关性能,但最终只归结为您的需要和知道答案。

至于手头的问题,任何时候你使用一个委托(这是一个lambda创建的)而不是直接执行代码,你会得到一个性能影响。在大多数情况下,命中率是可以接受的,但如果这段代码需要绝对最佳性能(比如说它在内部循环中),那么你需要使用第一种方法。这就是说,如果你正在创建一个查询字符串,那么你可能会打到数据库,这可能比首先创建查询字符串的任何方法花费的时间要长得多。

11

我会做这样的:

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

你产生更少的对象(即必须由垃圾收集清理)这样

+0

对于那些(像我)谁在这个偶然的的一般方法从NameValueCollection生成url,这对于具有多个值的参数无法正常工作。提示:遍历'parameters.GetValues(key)'。 – mcNux 2014-06-12 15:30:53

0

的NameValueCollection的ToString方法将建立查询字符串为您。我没有做过任何基准测试,但我可以想象执行会比使用lambdas或foreach的效率更高效。

(该ToString解决方案似乎并没有被很好地记载;我只找到它,因为this answer使用它的代码示例)。

相关问题