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

Kev*_*son 10 c# performance lambda query-string

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

如何使用迭代函数将NameValueCollection转换为(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());
}
Run Code Online (Sandbox Code Playgroud)

将一个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]))));
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*rne 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;
} 
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*ton 2

首先,您能做的最好的事情就是测试并查看性能是否适合您的应用程序,我们可以告诉您有关性能的一般性信息,但最终取决于您的需求,只有您知道答案。

至于手头的问题,每当您使用委托(这是 lambda 创建的)而不是直接执行代码时,性能都会受到影响。在大多数情况下,命中是可以接受的,但如果此代码需要绝对最佳的性能(假设它位于内部循环中),那么您需要使用第一种方法。

也就是说,如果您正在创建查询字符串,那么您可能即将访问数据库,这可能比首先创建查询字符串的任何一种方法都要花费更长的时间。