LoginSignup
3
5

More than 1 year has passed since last update.

【C#】文字列を連結する[区切り文字で][拡張メソッドで][implode]

Last updated at Posted at 2021-09-24

はじめに

 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() という拡張メソッドの実装があります。

C# コレクションを指定した文字で連結する - Qiita

 しかし一つのメソッドの中に二つの処理が含まれていることに、少々抵抗を感じます。私なら、以下のように書きたくなるかも。

var str = sqrts.FormatWith("0.000").ConcatWith(", ");
3
5
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5