使用 LINQ 很长时间了,最近才发现之前不太重视的 let 子句 在有些情况下蛮好用的,于是记录一下。
本文大部分内容参考自《深入理解 C#》 11.4.1 用let来进行中间计算。
什么是 let 子句
let 子句用于在 LINQ 查询中引入一个中间变量,它的值基于查询中的其它变量。
let 子句示例
下面以按用户名长度排序,输出数据集中用户名及其长度为例。
先看看不用 let 子句的情况下:
var query = from user in SampleData.AllUsers
orderby user.Name.Length
select user.Name;
foreach (var name in query)
{
Console.WriteLine("{0}: {1}", name.Length, name);
}
可以看到排序时和输出时都调用了 Length 属性,造成了冗余的计算。
使用 let 子句后:
var query = from user in SampleData.AllUsers
let length = user.Name.Length
orderby length
select new { Name = user.Name, Length = length };
foreach (var entry in query)
{
Console.WriteLine("{0}: {1}", entry.Length, entry.Name);
}
由于中间变量 length 的存在,Length 属性只需调用一次。