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:う
コメント