Interactive Extensionsを自分で実装する – 3.Concat

Interactive Extensions(Ix)を自分で実装する、第3回はConcatです。

シーケンスのシーケンスあるいはシーケンスの配列を引数にとって、平らなシーケンスとして返すインターフェースです。ちなみにF#では yield! と書くそうです。
Concatには2つのオーバーロードがあり、使い方と出力は以下のようになります。
用例:

static void ConcatTest1()
{
    var sequence = Enumerable.Range(1, 2);
    var sequence2 = Enumerable.Range(3, 3);
    var sequence3 = Enumerable.Range(6, 4);
    var mergedSequence = EmulateIxExtensions.Concat(sequence, sequence2, sequence3);
    foreach (var item in mergedSequence) {
        Console.Write(item);
    }
}

static void ConcatTest2()
{
    var sequences = new[]{
        Enumerable.Range(1, 2),
        Enumerable.Range(3, 3),
        Enumerable.Range(6, 4)};
    var mergedSequence = sequences.Concat();
    foreach (var item in mergedSequence)
    {
        Console.Write(item);
    }
}

concat

いずれの出力も同じです。シーケンスを合体させるので[ {1,2}, {3,4,5}, {6,7,8,9} ] を合体させて、{1,2,3,4,5,6,7,8,9} となるわです。

実装です。Lets’s Implement It!

Concat…渡された複数のシーケンスを1つのシーケンスに統合する。

namespace EmulateInteractiveExtensions
{
    public static class EmulateIxExtensions
    {
        public static IEnumerable<T> Concat<T>(this IEnumerable<IEnumerable<T>> sources){
            if (sources == null){
                throw new ArgumentNullException();
            }
            foreach (var source in sources){
                foreach (var item in source){
                    yield return item;
                }
            }
        }
        public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] sources)
        {
            return sources.Concat();
        }
    }
}

オーバーロードのIEnumerable<T>[]をとるほうは、配列が引数です。配列はIEnumerableを実装するので前者実装をそのまま使えます。前回のBufferより簡単ですね。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中