転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】LINQ to Objectsまとめ

C#の特徴でもあるLINQ to Objects。自分の中では、C#SQLの構文が使えるイメージでいる。それは、LINQに用意されているメソッドが、「Where」、「Select」などクエリ演算子と呼ぶからだ。

var list = new List<string> {
                "Tyokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Honkong"
};

// 文字列の長さが5以上の要素を抽出
IEnumerable<string> query = list.Where(s => s.Length <= 5);

このコードを見ると、Listで用意されているFindAllメソッドと同じ結果が得られる。

List<string> names = list.FindAll(s => s.Length <= 5);

どちらも簡単な書式だし、ラムダ式を使っているし、わざわざLINGを使うメリットって何なのかというと、ここで使ったWhereメソッドはIEnuberableインタフェースを実装している型ならば、どんなものにも使用できるという点。

// 配列でも使用できる
var array = new string[] {
                "Tyokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Honkong"
            };

IEnumerable<string> query = array.Where(s => s.Length <= 5);

反対に、FindAllクラスはListでしか使用できない。

var list = new string[] {
                "Tyokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Honkong"
};

// コンパイルエラーになる
var names = list.FindAll(s => s.Length <= 5);

型によって、メソッドを変えるのが面倒なので、LINQを使った方が便利。また、Whereメソッドの戻り値がIEnumerable型なので、こんな書き方もできる。

var array = new string[] {
                "Tyokyo", "New Delhi", "Bangkok", "London", "Paris", "Berlin", "Canberra", "Honkong"
            };


 // 元々はArray型だったものを、List型にキャストしている
List<string> query = (List<string>)array.Where(s => s.Length <= 5);

インタフェースでやりとりできると、色々便利だ。
LINQのメリットはこれだけじゃないと思うけど、自分の中の理解としてはこんな感じ。
ということで、LINQ to Objects完璧に理解した。