C#の配列で要素毎の処理結果を得る(LINQ Select)

C#には LINQ というライブラリがあります。

LINQ を使えばコレクション(配列や List クラスなど)に対する処理を簡単に行う事が出来ます。

 

ここでは、LINQ を使って配列に格納された要素に対して処理を行い、その結果を収めた新たな配列を作成する方法について解説します。

LINQとは

LINQ は IEnumerable<T>インターフェースへの拡張メソッドとして作られています。

つまり、配列Listクラス、Dictionaryクラス、ObservableCollectionクラスなどのIEnumerable<T>インターフェースを実装するオブジェクトであればどれでも同じように使用する事ができます。

 

LINQをつかうには using で System.Linq を参照できるようにしておきましょう。

using System.Linq;

各要素に対して処理を行う Select メソッド

配列内の要素それぞれに処理を行い結果を得るには Select メソッドを使用します。

引数に処理内容を指定しますが、ラムダ式を使って記述するのが簡単で一般的な方法です。

※ラムダ式の詳細はC#のラムダ式【=>】って何?をご覧ください

配列内の要素それぞれに処理を行い結果を出力する例

以下の例では各要素の X と Y を足した結果を作成しています。

            Point[] testArray = new Point[5];
            testArray[0] = new Point(4, 5);
            testArray[1] = new Point(2, 6);
            testArray[2] = new Point(1, 6);
            testArray[3] = new Point(4, 2);
            testArray[4] = new Point(6, 3);

            IEnumerable<double> testSelect = testArray.Select(o => o.X + o.Y);
            foreach (double obj in testSelect)
            {
                Console.WriteLine("X+Y=" + obj);
            }

Whereメソッドの戻り値はIEnumerable<T>です。

※ラムダ式の戻り値がdouble型なのでIEnumerable<double>になります

 

IEnumerable<T>はそのまま foreach 文で利用する事が出来ます。

配列内の要素それぞれに処理を行い結果を配列にする例

LINQ には 結果を配列として取得する ToArray() や、 Listクラスとして取得する ToList() メソッドがあります。

            IEnumerable<double> testSelect = testArray.Select(o => o.X + o.Y);
            double[]            testArray2 = testSelect.ToArray();

以下のように1行で書くことも出来ます。

            double[] testArray2 = testArray..Select(o => o.X + o.Y).ToArray();

LINQは遅延実行される

上記のToArray()で配列を取得している例をみると、

  1. Selectメソッドで IEnumerable<T>にデータが作られる
  2. ToArrayメソッドで配列の形式にデータが変換される

のように見えて二度手間な感じがしてしまいますが、実際の動きは少し異なります。

 

戻り値が IEnumerable<T> となるメソッドでは、データに対するアクションは行われません。

Selectメソッドはどのような処理をするかというコマンドだけを溜め込んでいるような状態です。

 

LINQ は foreach 文や ToArrayなどのメソッドを実行する時にデータが作成されます。

このような仕組みによって、Whereなど他のLINQメソッドと併用しても高速に結果を得られるようになっています。

 

関連記事