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);
        }
    }
}