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()で配列を取得している例をみると、
- Selectメソッドで IEnumerable<T>にデータが作られる
- ToArrayメソッドで配列の形式にデータが変換される
のように見えて二度手間な感じがしてしまいますが、実際の動きは少し異なります。
戻り値が IEnumerable<T> となるメソッドでは、データに対するアクションは行われません。
Selectメソッドはどのような処理をするかというコマンドだけを溜め込んでいるような状態です。
LINQ は foreach 文や ToArrayなどのメソッドを実行する時にデータが作成されます。
このような仕組みによって、Whereなど他のLINQメソッドと併用しても高速に結果を得られるようになっています。
関連記事
- C#のデリゲート (delegate) って何?
- C#のデリゲートを手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)

コメント
コメントを投稿