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

时间:2009-07-14 22:59:10

标签: c# string extension-methods linq-to-objects

我有一些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 个答案:

答案 0 :(得分:22)

怎么样:

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()步骤。

答案 1 :(得分:16)

你试过String.Join吗?如果您已经愿意承担.ToList调用的开销,那么请使用.ToArray()并将其与对String.Join的调用结合起来。

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

注意:我的解决方案可能不是最快的,因为它涉及阵列中的一些开销。我的怀疑是,走Marc的路线会更快。但在大多数情况下,如果您只是在寻找快速而肮脏的方式在代码中执行此操作,我的路线将起作用。

答案 2 :(得分:3)

像这样使用“Aggregate”:

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

注意:Aggregate在System.Linq命名空间中作为扩展方法。

答案 3 :(得分:1)

data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();

答案 4 :(得分:1)

您可以使用此声明。 的string.join( “”,someOtherList);

答案 5 :(得分:0)

根据JIT如何优化它,string.Concat()或Marc的StringBuilder方法可能更快。既然你在这里使用Linq,我会假设性能不是绝对的#1要求,在这种情况下,我会选择最简单的方法:

string.Concat(data.ToArray());

编辑:当且仅当数据是值类型的IEnumerable时,您需要将其强制转换为IEnumerable&lt; object&gt;:

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

编辑2:我并不认为Linq很慢。我的意思是,如果可测量的话,我提到的两种方式之间的速度差异应该非常小。

编辑3:JIT优化了String类上的几乎所有操作,因此对string.Concat的内部运行时的单次调用确实比使用StringBuilder更快。我不确定是不是,但你应该测试它以确保它。

答案 6 :(得分:0)

替代:

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