let句
プログラミングC# 第6版 8.1.3
クエリ式の中で使用できる一時変数を定義するためのものです。
まずはlet句を使わなかった場合の処理を見てみましょう。
using System; using System.Linq; // 数値チェッククラス class CheckNum { private int _num; public int num { get { return _num; } } public CheckNum(int i) { _num = i; } // 偶数かどうか public bool isEven () { return num % 2 == 0; } } class Program { static void Main() { int[] nums = new int[] { 1,2,3,4,5,6,7,8,9,10 }; var ret = from i in nums where new CheckNum(i).isEven() select new CheckNum(i).num; foreach(int i in ret) { Console.WriteLine(i); } } }
$ main 2 4 6 8 10
処理自体にあまり意味はありませが、whereとselectでCheckNumを無駄に二回newしているのがわかります。
これをlet句を使うことで一時変数として保持し、newを一回にすることが可能になります。
class Program { static void Main() { int[] nums = new int[] { 1,2,3,4,5,6,7,8,9,10 }; var ret = from i in nums let checkNum = new CheckNum(i) where checkNum.isEven() select checkNum.num; foreach(int i in ret) { Console.WriteLine(i); } } }