1. ホーム
  2. c#

[解決済み] LINQを使用して文字列を連結する

2022-03-14 09:18:37

質問

昔ながらの書き方で一番効率的なのは?

StringBuilder sb = new StringBuilder();
if (strings.Count > 0)
{
    foreach (string s in strings)
    {
        sb.Append(s + ", ");
    }
    sb.Remove(sb.Length - 2, 2);
}
return sb.ToString();

...LINQで?

どのように解決するのですか?

この回答では、LINQ ( Aggregate のように、日常的に使用することを意図したものではありません。なぜなら、これは StringBuilder は、非常に長いシーケンスに対して恐ろしいパフォーマンスを発揮します。通常のコードでは String.Join のように、他の 回答

このように集計クエリを使用します。

string[] words = { "one", "two", "three" };
var res = words.Aggregate(
   "", // start with empty string to handle empty list case.
   (current, next) => current + ", " + next);
Console.WriteLine(res);

これが出力されます。

, 1, 2, 3

集約は、値のコレクションを受け取り、スカラー値を返す関数である。T-SQLの例では、min、max、sumなどがあります。VBとC#の両方が集約をサポートしている。VBとC#の両方が、拡張メソッドとして集約をサポートしている。ドットノテーションを使うと、単純に IEnumerable オブジェクトを作成します。

集約クエリは即座に実行されることを覚えておいてください。

詳細はこちら MSDN 集計クエリ


本当に使いたいのなら Aggregate を使用してバリアントを使用します。 StringBuilder のコメントで提案された コードモンキーキング と同じようなコードになります。 String.Join 大量のオブジェクトを扱う場合のパフォーマンスも良好です。

 var res = words.Aggregate(
     new StringBuilder(), 
     (current, next) => current.Append(current.Length == 0? "" : ", ").Append(next))
     .ToString();