
複数のコレクションをforeachで同時に扱いたいけどいい方法はないかな



LINQのZipメソッドを利用することで、複数のコレクションを合体させて一度に処理することができます。


目次
Zipで合体させる
Zipメソッドを利用してコレクションを合体させるというのは、.netではあまり一般的ではないかもしれませんが、Pythonなんかではよく利用されている手法なので、.netでも利用したいという方は増えて来ているのではないかなと思います。
.netでもZipメソッドを利用することで複数コレクションを簡単に合体させて扱うことができます。
以下が利用例になります。


private void button1_Click(object sender, EventArgs e)
{
var name = new string[] { "田中", "佐藤", "森田" };
var score = new int[] { 30, 40, 50 };
//LINQのZIPでマージする
var results = name.Zip(score, (n, s) => new { Name = n, Score = s });
foreach (var X in results)
{
MessageBox.Show("Name:" + X.Name + "| 点数:" + X.Score);
}
} Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim name = New String() {"田中", "佐藤", "森田"}
Dim score = New Integer() {30, 40, 50}
'LINQのZIPでマージする
Dim results = name.Zip(score, Function(n, s) New With {.Name = n, .Score = s})
For Each X In results
MsgBox("Name:" & X.Name & "| 点数:" & X.Score)
Next
End SubCHECK
複数のコレクションを合体させたい場合は、1コレクションごとにZipメソッドを繋げる(Item.Zip(省略).Zip(省略))ことでいくつでも合体させることができます。
Zipメソッドの定義
Zipメソッドは公式で以下のように紹介されています。
public static System.Collections.Generic.IEnumerable<TResult> Zip<TFirst,TSecond,TResult> (this System.Collections.Generic.IEnumerable<TFirst> first, System.Collections.Generic.IEnumerable<TSecond> second, Func<TFirst,TSecond,TResult> resultSelector);2 つのシーケンスの対応する要素に対して、1 つの指定した関数を適用し、結果として 1 つのシーケンスを生成します。


