Linqで項目間に区切りを入れる

LinqでIEnumerableの各項目の間に区切りを入れるメソッドを C# で作ってみた。

using System.Collections.Generic;

namespace DelimitItemsByLinq
{
    public static class EnumerableExtension
    {
        /// <summary>
        /// 指定の<param name="enumerable" />の各項目の間に、<param name="delimiter" />を挿入します。
        /// </summary>
        public static IEnumerable<T> Delimit<T>(this IEnumerable<T> enumerable, T delimiter)
        {
            bool afterSecond = false;
            foreach (T item in enumerable)
            {
                if (afterSecond)
                {
                    yield return delimiter;
                }

                yield return item;
                afterSecond = true;
            }
        }
    }
}
  • メソッド Delimit は、IEnumerable の拡張メソッド。
  • 指定の IEnumerable の各要素 item を yield return で返す。
  • 2番目以降の item の前に、指定の区切り delimiter を yield return で返す。

このメソッドの使用例は、以下の通り。区切りを入れたい IEnumerable に対して、このメソッド Delimit を呼び出し、引数として区切りを指定する。

using System;
using System.Collections.Generic;

namespace DelimitItemsByLinq
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] strArray = { "one", "two", "three" };

            IEnumerable<string> delimitedStrEnumerable = strArray.Delimit(", ");

            foreach (string str in delimitedStrEnumerable)
            {
                Console.Write(str);
            }
            Console.WriteLine();

            // 出力は "one, two, three"
        }
    }
}