はじめに
少し前にラムダ式について記事を書いてみましたが、 さらにC#でよく見かける記述、LINQについての備忘録を記載します。
ラムダ式はデリゲートの引数として、一度しか使わない関数を、以下のようにその場で簡単に書くことができる記法でした。
(int n) => { return (n % 3 == 0); }
上の例だと、=>
の左側がint型の引数で、右側はnが3で割り切れる場合にTrueを返すことを表していて、
これを更に簡略化して n => n % 3 == 0
と記載できるといった内容でした。
LINQはこのラムダ式の記法と共通する点があり、そのまま覚えてしまうと頭に入りやすいと思います。
LINQの使い方
とりあえずLINQとはどんなものか活用例を見て頂きたいと思います。
namespace Sample { class LinqTest { static void Main() { int[] src = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; IEnumerable<int> n = src.Select(x => x + 100); Console.WriteLine("{0}", string.Join(", ", n)); } } }
実行結果
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
x => x + 100
の部分はラムダ式と同じ記法になります。引数xに渡した各配列要素に100を加えてreturnしているわけです。
LINQの主な特徴としては、以下が挙げられます。
- LINQは配列やリストなどコレクションの要素を処理する。
- 処理内容をメソッドで指定できる。(上の例だとSelect)
- LINQの処理で返す型はIEnumerable<各要素の型(上の例だとint)>
- 記述が簡潔にすむ。
LINQとは何かを簡潔に表すと、ループ処理を簡単に記載するためのメソッドを提供するライブラリです。
Select
メソッドを使うことで、単純に各要素に対する処理結果を取得していることがわかります。(例えば10を渡した結果110が返ってくる。)
Select
の他によく登場するメソッドとしてWhere
があります。
例えば、上の例にあるsrc.Select(x => x + 100)
にWhereを追加して、
src.Select(x => x + 100).Where(y => y % 2 == 0)
で実行した場合、
実行結果は以下になります。
100, 102, 104, 106, 108, 110
Where
の引数には、y => y % 2 == 0
のように通常、真偽値を返す処理を記載します。結果がTrueの要素のみ出力しています。
ここまで見ると、src
の値をx
に渡し、更にsrc.Select(x => x + 100)
の結果を後続のy
に渡しているのがわかるでしょう。
最後に、上記のWhereを使ったLINQをforeachで書き直してみました。同じ内容でも記述量が全然違います。
namespace Sample { class LinqTest { static void Main() { int[] src = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List<int> dst = new List<int>(); foreach(int i in src) { int sum = i + 100; if(sum % 2 == 0) { dst.Add(sum); } } foreach (int i in dst) { { Console.WriteLine("{0}", string.Join(", ", i)); } } } } }
以上、非常に単純なサンプルを用いてLINQについて触れてみました。
他にも色んなメソッドがありますが、基本的な活用方がわかればある程度は内容がわかるのではないでしょうか。