使用 LINQ 很长时间了,最近才发现之前不太重视的 let 子句 在有些情况下蛮好用的,于是记录一下。

本文大部分内容参考自《深入理解 C#》 11.4.1 用let来进行中间计算。

什么是 let 子句

let 子句用于在 LINQ 查询中引入一个中间变量,它的值基于查询中的其它变量。

语法:let 标识符 = 表达式

let 子句示例

下面以按用户名长度排序,输出数据集中用户名及其长度为例。

先看看不用 let 子句的情况下:

  1. var query = from user in SampleData.AllUsers
  2. orderby user.Name.Length
  3. select user.Name;
  4. foreach (var name in query)
  5. {
  6. Console.WriteLine("{0}: {1}", name.Length, name);
  7. }

可以看到排序时和输出时都调用了 Length 属性,造成了冗余的计算。

使用 let 子句后:

  1. var query = from user in SampleData.AllUsers
  2. let length = user.Name.Length
  3. orderby length
  4. select new { Name = user.Name, Length = length };
  5. foreach (var entry in query)
  6. {
  7. Console.WriteLine("{0}: {1}", entry.Length, entry.Name);
  8. }

由于中间变量 length 的存在,Length 属性只需调用一次。