.net column

.NET開発者のためのブログメディア
データのアクセスと変換

C#とLINQで要素を変換する。SelectとSelectManyの違いとは

2020年09月16日

LINQ(統合言語クエリ)は.NET Framework 3.5から搭載されたデータにアクセスするための機能です。LINQは学習の難易度が高く、特にコレクションの中のコレクションから要素を取り出す部分は苦手にしている方も多いのではないでしょうか。ここでは要素を取り出す際に使用する「Select」と「SelectMany」についてそれぞれ解説していきます。

SE
LINQは慣れるまで時間がかかりそうです。「Select」と「SelectMany」の使い分けがいまいち分かっていません。どう使い分けを行うのでしょうか?
PL
Selectメソッドは、データ構造の形を変えないで取得する場合に利用し、コレクションの各要素の操作に使えます。これに対してSelectManyメソッドはコレクションを展開して平坦化する場合に利用し、コレクションの中のコレクションの操作に使う場合がほとんどです。

実行環境
・Visual Studio 2017

Select とSelectManyメソッドの基本

SelectとSelectManyの両者に共通していることは、新しい要素のシーケンスを作成する(要素を射影するとも)メソッドである点です。

Selectメソッドは新しいシーケンス(コレクション)を作成します。JavaScriptでいうとmap のような動作となります。これに対して、SelectManyメソッドはSelectメソッドによって2次元で返されたコレクションを1次元のコレクションにして(平坦化して)返します。

まずは下記のSelectメソッドのプログラムを実行します。

実行結果
Selectメソッド実行結果

Select メソッドでは、与えられたデリゲートが返すオブジェクトをそのまま新たなシーケンスの要素とします。そのため、各要素が int 型の配列であるシーケンスを返すことになり、その結果要素数は元のシーケンスと同じく3個となります。

次に下記のSelectManyメソッドのプログラムを実行します。

実行結果
SelectManyメソッドの実行結果

SelectManyメソッドでは、与えられたデリゲートが返すオブジェクトを平坦化します。そのため、取得できたint 型の配列の各要素が新たなシーケンスの各要素になり、結果としてint 型のシーケンスが生成されることになります。上記の実行例で確認すると、1+2+3=6 個の要素を持つシーケンスとなっていることが分かるでしょう。

Selectメソッドの使い方

次にデータを設定して、Selectメソッドの活用例を確認してみましょう。

実行結果
Selectメソッドの実行例

SelectManyメソッドの使い方

同様に、SelectManyメソッドの活用例も確認してみましょう。

実行結果
SelectManyメソッドの実行例

SE
LINQを使えばいろいろなことができそうですね。ここで学んだSelectManyとSelectを上手に使い分けるところからLINQを勉強していきます!
PL
LINQは使えるようになればとても便利なスキルとなります。SelectManyとSelectを使いこなせるだけでも、ワンランク上のプログラマーだと思いますよ。

SelectManyとSelectを使い分けて、LINQを使いこなそう

LINQは処理速度も速く、慣れれば使い勝手が良い機能ですが、慣れるまで時間はかかります。今回解説したSelectとSelectManyも最初はどちらを使うか迷う方が多い機能です。一般的にフラットな形で出力したい場合はSelectManyメソッドを使います。2つのメソッドを上手に使いこなして、良質なプログラミング開発を行っていきましょう。

>>>C#の案件を探すならFEnet .NET Navi


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)