2009-07-14 29 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);

相關問題