複数の文字列をセパレータ文字で区切って結合する方法(LINQ編)

この記事は公開から4年以上経過しています。

.NET系開発で複数の文字列をカンマなどで区切りたいシーンでは、

var data = new[] { "a", "b", "c" };
Console.WriteLine(string.Join(",", data));

のようにstring.join()を使うケースが多いと思いますが、IEnumerable<>であれば

// C#
var data = new[] { "a", "b", "c" };
Console.WriteLine(data.Aggregate((x, y) => $"{x},{y}"));
' VB.NET
Dim data = {"a","b","c"}
Console.WriteLine(data.Aggregate(Function(x,y)($"{x},{y}")))

のように、LINQのAggregate()で同等の処理を行なうことができます。

但し、上記の{"a","b","c"}をLINQのAggregate()と文字列補完で結合する場合の内部処理は

"a"
"a" + "," + "b"
"a,b" + "," + "c"

のような逐次的な結合となるため結合文字数が増えると大きなパフォーマンス低下が生じますので、使用にあたっては非機能要件の面も踏まえて検討が必要です。

LINQはとても便利ですが利用経験が浅い程に乱用されてしまう傾向が強いため、遅延評価/即時評価のメリット/デメリットを含めLINQクエリ全体がどのように処理されるのかを常に意識して利用する事が大切です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする