使用ac#lambda effective将NameValueCollection转换为查询字符串?

在研究如何将NameValueCollection转换为查询字符串时,我遇到了不同的方法。 我很好奇,如果较短的lambda语法尽可能高效。

如何使用迭代函数将NameValueCollection转换为(Query)String 。

public static String ConstructQueryString(NameValueCollection parameters) { List items = new List(); foreach (String name in parameters) items.Add(String.Concat(name, "=", System.Web.HttpUtility.UrlEncode(parameters[name]))); return String.Join("&", items.ToArray()); } 

将一个NameValueCollection加入到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])))); } 

首先,您可以做的最好的事情是测试并查看您的应用程序的性能是否可以接受,我们可以告诉您有关性能的一般性,但最终它归结为您的需求,只有您知道答案。

至于手头的问题,任何时候你使用委托(这是一个lambda创建的)而不是直接执行代码,你将受到性能影响。 在大多数情况下,命中是可以接受的,但是如果这个代码需要绝对最好的性能(比如它在内循环中),那么你需要使用第一种方法。

也就是说,如果你正在创建一个查询字符串,大概是你打算使用数据库,这可能比首先创建查询字符串的方法花费的时间要长得多。

我会这样做:

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

这样您可以创建更少的对象(必须由垃圾收集器清理)

NameValueCollection的ToString方法将为您构建查询字符串。 我没有做任何基准测试,但我认为实现比使用lambdas或foreach更有效。

ToString解决方案似乎没有详细记录;我只找到它,因为这个答案在代码示例中使用它。)