はじめに
C# には String.Join()
がありますが、コレクションを Linq で操作する流れで、そのままメソッドチェーンにつなぎ、結合したいことがあります。
Split()
メソッドがあるのに、その逆の処理をする拡張メソッドが無い。
標準の拡張メソッド Join()
は違う用途なので、また違う名前にしなければいけません。例えば PHP の implode()
のような名前に。
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;
namespace ImplodeTest
{
static class Ext
{
/// <summary>
/// リストの値を区切り文字で繋げて返す。
/// </summary>
/// <param name="source">繋げる対象のリスト</param>
/// <param name="separator">区切り文字。規定値は空文字列</param>
/// <returns>繋げた文字列</returns>
public static string Implode<T>(this IEnumerable<T> source, string separator = "")
{
if (!(source?.Any() ?? false))
{
// 空のリストなら空白を返す。
return "";
}
return string.Join(separator, source);
}
}
class Program
{
static void Main(string[] args)
{
var theList = new List<string>() { "Apple", "Banana", "Citrus" };
Console.WriteLine(theList.Implode(","));
// 出力 -> Apple,Banana,Citrus
}
}
}
メソッド名について
デフォルト引数を含めて PHP に寄せてしまいました。
.NET に慣れている人ならいっそ StringJoin()
などの方が馴染み深いかもしれません。
もし CSV データを作成したいなら ToCsv()
や ToSeparatedValue()
もいいかもしれません。
探してみた
下記の記事に同じ発想で ConcatWith()
という拡張メソッドの実装があります。
しかし一つのメソッドの中に二つの処理が含まれていることに、少々抵抗を感じます。私なら、以下のように書きたくなるかも。
var str = sqrts.FormatWith("0.000").ConcatWith(", ");