9

次のように、文字列のリストを生成する LINQ コードがあります。

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);

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

"Some "
"resulting "
"data here."

最終的には、次のような 1 つの文字列になるはずです。

"Some resulting data here."

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

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

しかし、それは正しくないようです。それが正しい解決策である場合、これを拡張メソッドに変換するにはどうすればよいですか?

4

7 に答える 7

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()ステップは必要ありません。

于 2009-07-14T23:02:23.113 に答える
16

String.Join を試しましたか? 既に .ToList 呼び出しのオーバーヘッドを受け入れる場合は、代わりに .ToArray() を使用し、それを String.Join への呼び出しと組み合わせます。

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

注: 私のソリューションは、配列に多少のオーバーヘッドが伴うため、おそらく最速ではありません。私の疑いでは、Marc のルートをもっと進んだ方が速いのではないかと思います。しかし、ほとんどの場合、コードでそれを行うための迅速で汚れた方法を探しているだけであれば、私のルートが機能します。

于 2009-07-14T23:01:29.090 に答える
3

次のように「集計」を使用します。

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

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

于 2009-07-14T23:04:49.210 に答える
1

このステートメントを使用できます。String.Join("",someOtherList);

于 2016-05-12T07:41:28.573 に答える
1
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
于 2009-07-15T00:25:14.613 に答える
0

別:

>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'
于 2013-07-18T18:45:14.177 に答える
0

JIT がどのように最適化するかに応じて、string.Concat() または StringBuilder を使用した Marc のメソッドの方が高速になる可能性があります。ここでは Linq を使用しているため、パフォーマンスが絶対的な最大の要件ではないと仮定します。その場合、最も読みやすいものを使用します。

string.Concat(data.ToArray());

編集: データが値型の IEnumerable である場合にのみ、それを IEnumerable<object> にキャストする必要があります。

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

編集 2: Linq が遅いという意味ではありません。私が言及した 2 つの方法の速度の違いは、測定可能であっても非常に小さいということだけを意味します。

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

于 2009-07-14T23:10:18.603 に答える