ch 11 查询表达式和 LINQ to Objects
intro
- Language Integrated Query (LINQ), C# 3的新特性。
- 标准查询操作符 -> 构成查询表达式 -> 转译为普通c#3 代码 -> 编译(推断、重载、Lambda表达式)
- 序列:一次只能取当前的那个元素。IEnumerable
- 延迟执行和流处理:查询表达式被创建时,不会访问数据,而是在内存中生成了这个查询的表现形式。过滤判断通过委托实例来表示,只有在访问结果的第一个元素的时候,才开始执行。每次只处理一个元素。
- 范围变量 (range variable)
- 声明式而非命令式,函数式编程思想
思考
- 何时使用查询表达式、何时使用点标记?
选择元素: from select
from 范围变量 in 数据源 where 过滤 select 投影
//11-2 from user in SampleData.AllUsers select user;
转译=>
SampleData.AllUsers.Select(user => user);
显式类型的范围变量:Cast, OfType
范围变量都可以是隐式类型。Cast,OfType将飞类型化序列转化为强类型。 遇到不匹配类型,Cast报错,OfType跳过。
//11-5 ArrayList list = new ArrayList { "First", "Second", "Third"}; IEnumerable<string> strings = list.Cast<string>(); list = new ArrayList { 1, "not an int", 2, 3}; IEnumerable<int> ints = list.OfType<int>();
筛选排序:where, orderby
where
//11-8 User tim = SampleData.Users.TesterTim; var query = from defect in Sample where defect.Status != Status.Closed where defect.AssignedTo = tim select defect.Summary;
- Q. 多个where