【问题标题】:Is converting a NameValueCollection to a querystring using a c# lambda efficient?使用 c# lambda 将 NameValueCollection 转换为查询字符串是否有效?
【发布时间】:2010-12-12 15:14:33
【问题描述】:

在研究如何将 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]))));
}

【问题讨论】:

    标签: c# performance lambda query-string


    【解决方案1】:

    我会这样做:

    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 生成 url 的一般方法的人,这对于具有多个值的参数不能正常工作。提示:循环遍历parameters.GetValues(key)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      ToString 解决方案似乎没有很好的文档记录;我之所以找到它是因为this answer 在代码示例中使用了它。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-23
        • 2021-06-13
        • 1970-01-01
        • 2018-02-02
        • 2010-11-25
        • 2016-10-23
        • 2010-10-18
        • 1970-01-01
        相关资源
        最近更新 更多