LINQ之路 7:子查询、创建策略和数据转换(要点笔记)
匿名类型
上面我们自己定义了类型TempProjectionItem来存放查询的结果。通过使用匿名类型,我们可以省去这种中间类型的定义,而由编译器来帮我们完成:
var intermediate = from n in names select new { Original = n, Vowelless = Regex.Replace(n, "[aeiou]", "") }; IEnumerable<string> query = from item in intermediate where item.Vowelless.Length > 2 select item.Original;
需要注意的是,因为匿名类型的确切类型名是由编译器自动产生的,因此intermediate的类型为:IEnumerable <random-compiler-produced-name> 。我们来声明这种类型的唯一方式就是使用var关键字,这时,var不只是更加简洁,而且也是必需的手段。
let关键字
let关键字让我们可以在保持范围变量的同时引入新的查询变量。比如上面的示例,我们可以用let关键字作如下改写:
string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; var query = from n in names let Vowelless = Regex.Replace(n, "[aeiou]", "") where Vowelless.Length > 2 select n; //正是因为使用了let,此时n仍然可见