2009-07-14 27 views
9

我有一个生成的字符串列表,像这样的一些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(); 

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

回答

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

+0

+1这不是最短的方法,但OP显然要求*最快*,并且这确实是使用`ToArray()`继`string.Concat` /`string.Join`。 – Noldorin 2009-07-14 23:11:08

+0

@Noldorin:最快是有点不明确;)对于程序员或机器? – 2009-07-14 23:12:42

16

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

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

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

+2

任何特殊原因不使用`string.Concat`? – 2009-07-14 23:07:48

+0

@Mehrdad,不,加入只是第一个今天突然出现在我脑海中的人。 – JaredPar 2009-07-14 23:15:29

+0

在我的测试中,表现与Marc的解决方案是一致的(对于各种各样的字符串和集合长度),因此您可以获得我的投票。 – LukeH 2009-07-15 08:38:01

3

使用 “聚合” 是这样的:

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

注:总在System.Linq的命名空间的扩展方法。

0

根据JIT如何优化它,string.Concat()或Marc的方法与StringBuilder可能会更快。既然你在这里使用LINQ,我会认为表现并不绝对#1的要求,在这种情况下,我用最简单的去阅读:

string.Concat(data.ToArray()); 

编辑:当且仅当数据一个值类型的IEnumerable的,你需要将它转换为一个IEnumerable <对象>:

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

编辑2:我真的不意味着LINQ的速度很慢。我只是说我提到的两种方法之间的速度差异应该是极小的,甚至可以衡量。

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

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

备选:

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

您可以使用此语句。 String.Join(“”,someOtherList);

相关问题