佐々木屋

技術的なことから趣味まで色々書きます

SelectManyメソッド

単純な配列に対して処理する場合は、SELECTメソッドで処理できますが、配列に配列を持つようなコレクションは少し面倒です。

例えば、

List<string[]> values = new List<string[]> 
                                {new string[] { "京都府", "京都市"},
                                 new string[] { "奈良県", "奈良市"},
                                 new string[] { "大阪府", "大阪市"},
                                 new string[] { "兵庫県", "神戸市"},
                                 new string[] { "和歌山", "和歌山市"}};
Dim values As New List(Of String()) From 
                                   {New String() {"京都府", "京都市"},
                                   New String() {"奈良県", "奈良市"},
                                   New String() {"大阪府", "大阪市"},
                                   New String() {"兵庫県", "神戸市"},
                                   New String() {"和歌山", "和歌山市"}}

このようなコレクションです。

これを一つのコレクションにするには、SelectメソッドでString.Joinメソッドなどを複合的に利用して処理する必要があります。

var res = values.Select(x => String.Join(",", x)).ToArray();
Console.WriteLine(String.Join(",", res));
Dim res = values.Select(Function(x) String.Join(",", x)).ToArray()
Console.WriteLine(String.Join(",", res))
京都府,京都市,奈良県,奈良市,大阪府,大阪市,兵庫県,神戸市,和歌山,和歌山市



これはSelectManyメソッドを使用すると簡単に一つのコレクションへ変形できます。この処理を「平坦化」と呼びます。

var res = values.SelectMany(x => x).ToArray();
Console.WriteLine(String.Join(",", res));
Dim res = values.SelectMany(Function(x) x).ToArray()
Console.WriteLine(String.Join(",", res))
京都府,京都市,奈良県,奈良市,大阪府,大阪市,兵庫県,神戸市,和歌山,和歌山市