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

C# 将字符串列表转换为单个串联字符串的最快方法?,c#,string,extension-methods,linq-to-objects,C#,String,Extension Methods,Linq To Objects,我有一些LINQ代码生成字符串列表,如下所示: var data = from a in someOtherList orderby a select FunctionThatReturnsString(a); "Some resulting data here." List<string> strings = new List<string>() {"bob", "steve", "jane"}; stri

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

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);
"Some resulting data here."
    List<string> strings = new List<string>() {"bob", "steve", "jane"};
    string result = strings.Aggregate((working, next) => working + next);
    Console.WriteLine(result);
如何将字符串列表转换为一个大的连接字符串?假设数据包含以下条目:

"Some "
"resulting "
"data here."
我应该得到一个字符串,如下所示:

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);
"Some resulting data here."
    List<string> strings = new List<string>() {"bob", "steve", "jane"};
    string result = strings.Aggregate((working, next) => working + next);
    Console.WriteLine(result);
我怎样才能很快做到这一点?我想了想:

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

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

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

var joined = String.Concat(someQuery.ToArray());
注意:我的解决方案可能不是最快的,因为它涉及到阵列中的一些开销。我怀疑走马克的路线会更快。但在大多数情况下,如果您只是在寻找一种快速而肮脏的代码方式,那么我的路线就行了

那么:

public static string Concat(this IEnumerable<string> source) {
    StringBuilder sb = new StringBuilder();
    foreach(string s in source) {
        sb.Append(s);
    }
    return sb.ToString();
}
这样就不需要额外的
ToList()
/
ToArray()
步骤。

使用如下“聚合”:

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);
"Some resulting data here."
    List<string> strings = new List<string>() {"bob", "steve", "jane"};
    string result = strings.Aggregate((working, next) => working + next);
    Console.WriteLine(result);
List strings=newlist(){“bob”、“steve”、“jane”};
字符串结果=strings.Aggregate((工作,下一步)=>working+next);
控制台写入线(结果);

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

根据JIT对其进行优化的方式,string.Concat()或Marc使用StringBuilder的方法可能会更快。因为这里使用的是Linq,所以我假设性能不是绝对的#1要求,在这种情况下,我会选择最容易阅读的:

string.Concat(data.ToArray());
编辑:如果且仅当数据是值类型的IEnumerable,则需要将其强制转换为IEnumerable:

string.Concat(data.Cast().ToArray())
编辑2:我不是说Linq很慢。我只是说,我提到的两种方式之间的速度差应该非常小,甚至可以测量

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

备选方案:

data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'

您可以使用此语句。
Join(“,someOtherList)

有没有什么特别的理由不使用
string.Concat
?@Mehrdad,没有,Join只是今天第一个出现在我脑海中的。在我的测试中,性能与Marc的解决方案不相上下(对于各种各样的字符串和集合长度),所以你可以得到我的投票。+1这不是最短的方法,但是OP显然要求最快的,这确实比使用
ToArray()
后跟
string.Concat
/
string.Join
@Noldorin:faster有点未定义;)程序员还是机器?谢谢!“最快”是指运行时间。@jasonh:如果速度是个问题,那么在列表中通过两次会更快,第一次是计算总长度,以便可以预先分配StringBuilder。@jasonh:我刚刚测试了它,它按照我的预期工作。你问题的原因是别的。Marc代码采用一个参数,该参数将成为隐式的,因为它是一个扩展方法,但MS版本采用2个参数(其中一个是隐式传递的)。他们可以快乐地生活在一起。从什么时候起Linq就相当于慢?为什么要做
data.Cast()
而不是像
data.Select(x=>x.ToString())
?字符串有一个成员字符串。Concat(object[]args)很可能更有效地执行内部ToString操作。您需要强制转换为对象的唯一原因是像int[]这样的值类型数组不能隐式转换为object[]。
Concat(object[])
重载只在内部调用标准的
ToString
方法。如果您自己对值类型执行
ToString
操作,而不是使用
Cast
将它们装箱,那么您可以使用
Concat(string[])
重载。您能再解释一下吗?可能不是最快的,但最简单!