在研究如何将NameValueCollection转换为查询字符串时,我遇到了不同的方法。如果较短的lambda语法尽可能高效,我很好奇。
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]))));
}
答案 0 :(得分: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;
}
这样您可以创建更少的对象(必须由垃圾收集器清理)
答案 1 :(得分:2)
首先,您可以做的最好的事情是测试并查看您的应用程序的性能是否可以接受,我们可以告诉您有关性能的一般信息,但最终它归结为您的需求,只有您知道答案这一点。
对于手头的问题,无论何时使用委托(这是lambda创建的)而不是直接执行代码,您都会受到性能影响。在大多数情况下,命中是可以接受的,但是如果这个代码需要绝对最好的性能(比如它在内循环中),那么你需要使用第一种方法。
也就是说,如果你正在创建一个查询字符串,大概是你要打到数据库,这可能比首先创建查询字符串的方法花费的时间要长得多。
答案 2 :(得分:0)
NameValueCollection&#39; ToString
方法将为您构建查询字符串。我还没有完成任何基准测试,但我想象实现比使用lambdas或foreach更有效。
(ToString
解决方案似乎没有详细记录;我只是因为this answer在代码示例中使用它而找到它。)