20.C#LINQ基础和简单使用(十一章11.1-11.2)
2015-01-13 23:22
447 查看
终于看到了第11章,之前虽然也有看过,但没有太仔细,在工作中也偶尔会使用,但不明白其中的原理,那现在就来讲讲LINQ,做一做书虫~~
首先先了解下LINQ的三个要点:
LINQ不能把非常复杂的查询表达式转换成一行代码
使用LINQ不意味着你从此不再需要使用SQL
LINQ不可能魔法般地让你成为架构天才
序列是LINQ的基础,在你看到一个查询表达式的时候,应该要想到它所涉及的序列:一开始总是存在至少一个序列,且通常在中间过程会转换成其他序列,也可能和其他序列连接在一起。
上述的表达式作用:从一个汽车序列中找到里程大于200的车。下一句代码使用Lambda表达式来打印筛选出来的车主名。
延迟执行和流处理
上述中的查询表达式被创建的时候,不会立刻处理数据,也不会访问原始的汽车序列,而是在内存中生成这个查询的表现形式,这个特点叫延迟执行。如下,在result.ToList()执行时,才会开始对序列的操作。
投影
select expression 格式的语句,称为投影。
查询表达式会编译器转译为上面的代码,可以看到它们是由扩展方法和Lambda表达式组成。在任何时候,参数(大多情况)都是委托类型,编译器将用Lambda表达式作为实参,并尽量找到具有合适签名的方法。再来看下我们的表达式
from、where、in、select为查询表达式上下文关键字,e为范围变量、list为数据源序列、select e为返回投影。再看一个返回投影的例子。
这里的select e.Owner,即返回每辆车主的名字,那么result1的类型为IEnumerable<string>
Cast方法和OfType方法
使用Cast<T>()会把列表中元素转换成T类型,遇到不能转换的元素将报错,而OfType<T>()会尝试转换每个元素到T类型,遇到不能转换的元素则跳过。当显式声明使用范围变量时,会在转译时调用Cast()方法。如
表达式会转译为第三行的代码。
概念
LINQ是以数据列表为基础,在任何地方可能的地方进行流处理
创建一个查询表达式,不会立刻执行,大部分操作都会延迟执行
C#3的查询表达式包括一个把表达式转换成普通C#代码的预处理阶段,接着使用类型推断、重载、Lambda表达式等这些常规操作来恰当地对转换后的代码进行编译
在查询表达式中声明的变量:它们仅仅是范围变量,通过它们你可以在查询表达式内部一致地引用数据
请斧正。
首先先了解下LINQ的三个要点:
LINQ不能把非常复杂的查询表达式转换成一行代码
使用LINQ不意味着你从此不再需要使用SQL
LINQ不可能魔法般地让你成为架构天才
序列是LINQ的基础,在你看到一个查询表达式的时候,应该要想到它所涉及的序列:一开始总是存在至少一个序列,且通常在中间过程会转换成其他序列,也可能和其他序列连接在一起。
class Car { public string Owner { get; set; } public double Mileage { get; set; } } class Program { static void Main(string[] args) { var list = new List<Car> { new Car() { Owner="a",Mileage=100}, new Car() { Owner="b",Mileage=200}, new Car() { Owner="c",Mileage=300}, new Car() { Owner="d",Mileage=400}, new Car() { Owner="e",Mileage=500}, new Car() { Owner="f",Mileage=600} }; var result = from e in list where e.Mileage > 200 select e; result.ToList().ForEach(x => Console.WriteLine(x.Owner)); Console.ReadKey(); } }
上述的表达式作用:从一个汽车序列中找到里程大于200的车。下一句代码使用Lambda表达式来打印筛选出来的车主名。
延迟执行和流处理
上述中的查询表达式被创建的时候,不会立刻处理数据,也不会访问原始的汽车序列,而是在内存中生成这个查询的表现形式,这个特点叫延迟执行。如下,在result.ToList()执行时,才会开始对序列的操作。
投影
select expression 格式的语句,称为投影。
result.Where(e => e.Mileage > 200).Select(e => e);
查询表达式会编译器转译为上面的代码,可以看到它们是由扩展方法和Lambda表达式组成。在任何时候,参数(大多情况)都是委托类型,编译器将用Lambda表达式作为实参,并尽量找到具有合适签名的方法。再来看下我们的表达式
var result = from e in list where e.Mileage > 200 select e;
from、where、in、select为查询表达式上下文关键字,e为范围变量、list为数据源序列、select e为返回投影。再看一个返回投影的例子。
var result1 = from e in list where e.Mileage > 200 select e.Owner;
这里的select e.Owner,即返回每辆车主的名字,那么result1的类型为IEnumerable<string>
Cast方法和OfType方法
class Bigtruck :Car { public double Volume { get; set; } } var list0 = new List<Car> { new Car() { Owner="a",Mileage=100}, new Bigtruck() { Owner="b",Mileage=200,Volume=100.1}, new Bigtruck() { Owner="c",Mileage=300,Volume=100.2}, new Bigtruck() { Owner="d",Mileage=400,Volume=100.3}, new Bigtruck() { Owner="e",Mileage=500,Volume=100.4}, new Bigtruck() { Owner="f",Mileage=600,Volume=100.5} }; var castList = list0.Cast<Car>(); var oftypeList = list0.OfType<Bigtruck>(); Console.WriteLine(castList.Count()); //6 Console.WriteLine(oftypeList.Count()); //5
使用Cast<T>()会把列表中元素转换成T类型,遇到不能转换的元素将报错,而OfType<T>()会尝试转换每个元素到T类型,遇到不能转换的元素则跳过。当显式声明使用范围变量时,会在转译时调用Cast()方法。如
var result2 = from Car e in list select e; result2 = list.Cast<Car>().Select(e => e);
表达式会转译为第三行的代码。
概念
LINQ是以数据列表为基础,在任何地方可能的地方进行流处理
创建一个查询表达式,不会立刻执行,大部分操作都会延迟执行
C#3的查询表达式包括一个把表达式转换成普通C#代码的预处理阶段,接着使用类型推断、重载、Lambda表达式等这些常规操作来恰当地对转换后的代码进行编译
在查询表达式中声明的变量:它们仅仅是范围变量,通过它们你可以在查询表达式内部一致地引用数据
请斧正。
相关文章推荐
- C#基础之LINQ查询语句的简单使用(一)
- C# Linq的简单使用
- LinuxC/C++编程基础(20) 使用boost::asio搭建服务器简单实例
- C#中比较简单又使用的Linq
- C#学习笔记 LINQ简单使用
- [.net 面向对象编程基础] (20) LINQ使用
- C#使用命令行方式实现Ping简单功能
- 使用C#开发一个简单的P2P应用
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 在C#中使用代理的方式触发事件 的简单习作
- C#学习笔记(二十一):使用文件基础
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 企业信息化系统基础——AD:使用C#批量创建帐号
- 企业信息化系统基础——AD:使用C#批量创建帐号
- 企业信息化系统基础——AD:使用C#批量创建帐号
- 使用C#开发一个简单的P2P应用
- 使用C#开发一个简单的P2P应用
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分
- 使用C#开发一个简单的P2P应用
- 使用C#开发一个简单的P2P应用