LINQ基礎

クエリ演算子

LINQが用意しているメソッドのこと。
クエリ演算子は全て IEnumerable<T> に対する拡張メソッドとして定義されている。

シーケンス

標準クエリ演算子の操作対象のデータをシーケンスと呼ぶ。配列や List<T> 等。

クエリ遅延実行/即時実行

遅延実行

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 
  5 namespace Program
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             string[] names = {
 12                 "Tokyo", "New Delhi", "Bangkok", "Paris",
 13             };
 14             var query = names.Where(x => x.Length <= 5);
 15             
 16             foreach (var item in query)
 17                 Console.WriteLine(item);
 18             
 19             Console.WriteLine("----------------");
 20           
 21             names[0] = "Osaka";
 22             foreach (var item in query)
 23                 Console.WriteLine(item);
 24         }
 25     }   
 26 }
Tokyo
Paris
----------------
Osaka
Paris

Whereメソッドが呼び出されても、検索はその時には行われずに、
実際に値が必要になったとき(foreachで要素を取り出したとき)に、クエリが実行される。

即時実行

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 
  5 namespace Program
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             string[] names = {
 12                 "Tokyo", "New Delhi", "Bangkok", "Paris",
 13             };
 14             var query = names.Where(x => x.Length <= 5).ToArray(); // 配列に変換
 15             
 16             foreach (var item in query)
 17                 Console.WriteLine(item);
 18             
 19             Console.WriteLine("----------------");
 20           
 21             names[0] = "Osaka";
 22             foreach (var item in query)
 23                 Console.WriteLine(item);
 24         }
 25     }   
 26 }
Tokyo
Paris
----------------
Tokyo
Paris

ToArrayメソッドが呼び出されたときにクエリが実行され、結果が配列に格納される。
ToList メソッドに変えても同じ。Countメソッドとかも即時実行。

参考 :
実戦で役立つ C#プログラミングのイディオム/定石&パターン:書籍案内|技術評論社
LINQ クエリの概要 (C#) | Microsoft Docs