2009-07-14 15 views
9

文字列のリストを単一の連結文字列に変換する最速の方法は?

文字列のリストを次のように生成するLINQコードがあります。この文字列のリストを1つの大きな連結文字列に変換するにはどうすればよいですか?データに次のエントリがあるとしましょう:

"Some " 
"resulting " 
"data here." 

このような文字列で終わるはずです:

"Some resulting data here." 

どうすればこのことができますか?私はこれについて考えました:

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

しかし、それはちょうど正しいとは思わない。それが正しい解決策であれば、これを拡張メソッドに変える方法はありますか?

答えて

22

。このような

+0

+1これは最短の方法ではありませんが、OPは明らかに*最速*を求めています。これは実際には 'string.Concat' /' string.Join'に続く 'ToArray()'を使用しています。 – Noldorin

+0

@ Noldorin:最速ビットは未定義です;)プログラマまたはマシンの場合は? –

+0

ありがとう!最も速く走る時間を意味しました。 – jasonh

16

String.Joinを試しましたか? .ToList呼び出しのオーバーヘッドを既に取っている場合は、代わりに.ToArray()を使用し、それをString.Joinの呼び出しと組み合わせてください。

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

注:私の解決策は、アレイに少しオーバーヘッドが含まれているため、最も速くない可能性があります。私の疑惑は、マルクのルートをもっと進んでいく方が速いということです。しかし、コード内ですばやく汚れた方法を探しているのであれば、ほとんどの場合、私のルートは機能します。余分なToList()/ToArray()ステップを必要としない

string s = data.Concat(); 

この後、:

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

と:どの程度

+2

'string.Concat'を使用しない特別な理由はありますか? –

+0

@Mehrdad、nope、Joinは、今日私の頭の中に突き出た最初のものでした。 – JaredPar

+0

私のテストでは、パフォーマンスはMarcのソリューション(多種多様な文字列とコレクションの長さに対応)とネックアンドネックになっています。 – LukeH

3

使用 "集計":

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

注:集計は、拡張メソッドとしてSystem.Linqの名前空間にあります。

+3

それは***の***の中間の文字列の***になる可能性があります... –

0

JITの最適化の仕方によっては、String.Concat()またはMarcのStringBuilderメソッドが高速になる可能性があります。

string.Concat(data.ToArray()); 

編集を::、データがある場合にのみ場合は、ここでのLINQを使用しているので、私はパフォーマンスは私が読むために最も簡単でいいよ、その場合には、絶対#1の要件ではないと仮定します

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

編集2:値型のIEnumerableを、あなたはIEnumerableを<オブジェクト>にキャストする必要があります私は実際にLINQのが遅いというわけではありません。私が言及した2つの方法の速度差は、たとえ測定可能であっても極端に小さくなければならないことを意味します。

編集3:JITはStringクラスのほとんどすべての操作を最適化します。したがって、String.Concatの内部ランタイムへの単一呼び出しは、実際にはStringBuilderを使用するよりも高速になる可能性があります。私は確信していませんが、確かめるためにテストする必要があります。

+0

以来、Linqは遅いと同等でしたか? –

+0

私は編集#2を追加しました。 :) –

+0

なぜあなたは 'data.Select(x => x.ToString())'のようなものではなく、 'data.Cast ()'をしますか? – LukeH

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);

+0

もう少し説明できますか? –

+0

おそらく最速ではないかもしれませんが、最も簡単です! – newman

関連する問題