PR

[C# LINQ]2つのリストを結合(マージ)する[Zip]

LINQのZipメソッドを使うと複数のコレクション(リストなど)を結合(マージ)して1つのコレクションにすることができます。
この記事ではZipメソッドの使い方を紹介します。

スポンサーリンク

2つのリストを結合する

1つ目のリストのZipメソッドに引数に2つ目のリストを指定します。
要素の数が異なる場合、少ないほうに合わせてマージされます。
戻り値はそれぞれの要素が入ったタプル(First、Secondという名前付き)が返ってきます。
(T First, T Second)

using System;
using System.Collections.Generic;
using System.Linq;

namespace zip_test {
    class Program {
        static void Main(string[] args)
        {
            var list1 = new List<int> { 1, 2, 3, 4, 5 };
            var list2 = new List<string> { "a", "b", "c", "d" }; //こっちの要素の少ない方に合わせてマージされる

            //2つのリストを結合する
            foreach (var ret in list1.Zip(list2)) {
                Console.WriteLine($"{ret.First}:{ret.Second}");
            }
        }
    }
}

こんな感じで要素の少ない方に合わせてマージされる。

1:a
2:b
3:c
4:d

また、タプルなので分解してそれぞれの変数で受け取ることもできます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace zip_test {
    class Program {
        static void Main(string[] args)
        {
            var list1 = new List<int> { 1, 2, 3, 4, 5 };
            var list2 = new List<string> { "a", "b", "c", "d" };

            //2つのリストを結合する(結果のタプルを分解して受け取る)
            foreach ((var l1, var l2) in list1.Zip(list2)) {
                Console.WriteLine($"{l1}:{l2}");
            }
        }
    }
}
スポンサーリンク

3つのリストを結合する(C#10)

C#10からZipメソッドのオーバーロードが追加され3つめのリストが指定できるようになりました。
戻り値はFirst、Second、Thirdという名前付きタプルが返ってきます。
こちらも要素の少ないリストに合わせてマージされます。

using System;
using System.Collections.Generic;
using System.Linq;

namespace zip_test;
class Program
{
    static void Main() {
        var list1 = new List<int> { 1, 2, 3, 4, 5 };
        var list2 = new List<string> { "a", "b", "c", "d" };
        var list3 = new List<string> { "あ", "い", "う" };

        //C#10から3つのコレクションを結合できる
        var zipList = list1.Zip(list2, list3);
        foreach ((var l1, var l2, var l3) in zipList) {
            Console.WriteLine($"{l1}:{l2}:{l3}");
        }
    }
}
1:a:あ
2:b:い
3:c:う

C# プログラミング講座に戻る

コメント