代码之家  ›  专栏  ›  技术社区  ›  jasonh

将字符串列表转换为单个串联字符串的最快方法?

  •  9
  • jasonh  · 技术社区  · 15 年前

    我有一些生成字符串列表的LINQ代码,如下所示:

    var data = from a in someOtherList
               orderby a
               select FunctionThatReturnsString(a);
    

    如何将字符串列表转换为一个大的串联字符串?假设数据包含以下条目:

    "Some "
    "resulting "
    "data here."
    

    最后我会得到一条这样的线:

    "Some resulting data here."
    

    我怎么能这么快?我想到了:

    StringBuilder sb = new StringBuilder();
    data.ToList().ForEach(s => sb.Append(s));
    string result = sb.ToString();
    

    但这似乎不对。如果这是正确的解决方案,我该如何将其转换为扩展方法呢?

    7 回复  |  直到 9 年前
        1
  •  22
  •   Marc Gravell    15 年前

    怎么样:

    public static string Concat(this IEnumerable<string> source) {
        StringBuilder sb = new StringBuilder();
        foreach(string s in source) {
            sb.Append(s);
        }
        return sb.ToString();
    }
    

    还有:

    string s = data.Concat();
    

    这样就不需要额外的 ToList() / ToArray() 步骤。

        2
  •  16
  •   JaredPar    15 年前

    你试过弦吗?加入?如果您已经愿意承担.tolist调用的开销,那么使用.toarray()并将其与对string.join的调用结合起来。

    var joined = String.Concat(someQuery.ToArray());
    

    注意:我的解决方案可能不是最快的,因为它涉及到数组中的一些开销。我的怀疑是多走马克的路会更快。但在大多数情况下,如果你只是在寻找用代码来实现它的快速而肮脏的方法,那么我的路线是可行的。

        3
  •  3
  •   Mike    15 年前

    使用“聚合”如下:

        List<string> strings = new List<string>() {"bob", "steve", "jane"};
        string result = strings.Aggregate((working, next) => working + next);
        Console.WriteLine(result);
    

    注意:聚合作为扩展方法位于System.Linq命名空间中。

        4
  •  1
  •   Pavel Minaev    15 年前
    data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
    
        5
  •  1
  •   Malik    9 年前

    你可以用这句话。 string.join(“”,someotherlist);

        6
  •  0
  •   Sam Harwell    15 年前

    根据JIT如何优化它,使用StringBuilder的string.concat()或marc方法可能更快。既然您在这里使用LINQ,我假设性能不是绝对的1要求,在这种情况下,我将使用最容易阅读的:

    string.Concat(data.ToArray());
    

    编辑:如果且仅当数据是 价值类型 ,您需要将其强制转换为IEnumerable<object>:

    string.Concat(data.Cast<object>().ToArray())
    

    编辑2:我不是说LINQ速度慢。我的意思是,我提到的两种方法之间的速度差应该是非常小的,即使可以测量。

    编辑3:JIT优化了字符串类上的几乎所有操作,因此对string.concat内部运行时的单个调用实际上比使用StringBuilder更快。我不确定,但你应该测试一下。

        7
  •  0
  •   dmon    11 年前

    替代方案:

    >>> data = ['Some ', 'resulting ', 'data here.']
    >>> s = ''.join(data)
    >>> s
    'Some resulting data here.'