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
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完璧に理解した。