20.C#LINQ基础和简单使用(十一章11.1-11.2)
终于看到了第11章,之前虽然也有看过,但没有太仔细,在工作中也偶尔会使用,但不明白其中的原理,那现在就来讲讲LINQ,做一做书虫~~
首先先了解下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=},
new Car() { Owner="b",Mileage=},
new Car() { Owner="c",Mileage=},
new Car() { Owner="d",Mileage=},
new Car() { Owner="e",Mileage=},
new Car() { Owner="f",Mileage=}
}; var result = from e in list
where e.Mileage >
select e; result.ToList().ForEach(x => Console.WriteLine(x.Owner)); Console.ReadKey(); }
}
上述的表达式作用:从一个汽车序列中找到里程大于200的车。下一句代码使用Lambda表达式来打印筛选出来的车主名。
- 延迟执行和流处理
上述中的查询表达式被创建的时候,不会立刻处理数据,也不会访问原始的汽车序列,而是在内存中生成这个查询的表现形式,这个特点叫延迟执行。如下,在result.ToList()执行时,才会开始对序列的操作。
- 投影
select expression 格式的语句,称为投影。
result.Where(e => e.Mileage > ).Select(e => e);
查询表达式会编译器转译为上面的代码,可以看到它们是由扩展方法和Lambda表达式组成。在任何时候,参数(大多情况)都是委托类型,编译器将用Lambda表达式作为实参,并尽量找到具有合适签名的方法。再来看下我们的表达式
var result = from e in list
where e.Mileage >
select e;
from、where、in、select为查询表达式上下文关键字,e为范围变量、list为数据源序列、select e为返回投影。再看一个返回投影的例子。
var result1 = from e in list
where e.Mileage >
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=},
new Bigtruck() { Owner="b",Mileage=,Volume=100.1},
new Bigtruck() { Owner="c",Mileage=,Volume=100.2},
new Bigtruck() { Owner="d",Mileage=,Volume=100.3},
new Bigtruck() { Owner="e",Mileage=,Volume=100.4},
new Bigtruck() { Owner="f",Mileage=,Volume=100.5}
}; var castList = list0.Cast<Car>();
var oftypeList = list0.OfType<Bigtruck>(); Console.WriteLine(castList.Count()); //
Console.WriteLine(oftypeList.Count()); //
使用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表达式等这些常规操作来恰当地对转换后的代码进行编译
- 在查询表达式中声明的变量:它们仅仅是范围变量,通过它们你可以在查询表达式内部一致地引用数据
请斧正。
20.C#LINQ基础和简单使用(十一章11.1-11.2)的更多相关文章
- 鸟哥Linux私房菜(基础篇)——第十一章:认识与学习Bash
1.变量的取用与设定 ●变量的取用:echo ●变量的设定规则 变量与变量内容以一个等号『=』来连结. 等号两边不能直接接空格符. 变量名称只能是英文字母和数字,但是开头字符不能是数字. 变量内容若有 ...
- o'Reill的SVG精髓(第二版)学习笔记——第十一章
第十一章:滤镜 11.1滤镜的工作原理 当SVG阅读器程序处理一个图形对象时,它会将对象呈现在位图输出设备上:在某一时刻,阅读器程序会把对象的描述信息转换为一组对应的像素,然后呈现在输出设备上.例如我 ...
- CPrimerPlus第十一章中的“选择排序算法”学习
C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...
- CSAPP:第十一章 网络编程
CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型 每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...
- C#基础知识简单梳理
本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组, ...
- [.net 面向对象编程基础] (19) LINQ基础
[.net 面向对象编程基础] (19) LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...
- mysql数据库基础的简单操作指南
最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...
- LINQ之路(1):LINQ基础
本文将从什么是LINQ(What).为什么使用LINQ(Why)以及如何使用LINQ(How)三个方面来进行说明. 1.什么是LINQ LINQ(Language Integrated Query)是 ...
- LINQ基础(二)
本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblo ...
随机推荐
- js 操作select和option
js 操作select和option 1.动态创建select function createSelect(){ var mySelect = document.createElement_x(&qu ...
- Linux 下子线程 exit code 在主线程中的使用
Linux线程函数原型是这样的: void* thread_fun(void* arg) 它的返回值是 空类型指针,入口参数也是 空类型指针.那么线程的 exit code 也应该是 void * 类 ...
- linux设置tomcat开机启动
[root@iZ94j7ahvuvZ ~]# cd /etc/rc.d/ [root@iZ94j7ahvuvZ rc.d]# cat rc.local #!/bin/sh # # This scrip ...
- hiveql basic
set hive.cli.print.current.db=true; set hive.mapred.mode=strict; set hive.mapred.mode=nonstrict; SHO ...
- [转]ionic Accordion list three levels
简化后的主要代码: $scope.groups = []; for (var i = 0; i < 2; i++) { $scope.groups[i] = { name: i, items: ...
- Oracle中关于bitmap index的使用问题
您如果熟悉 Oracle 数据库,我想您对 Thomas Kyte 的大名一定不会陌生. Tomas 主持的 asktom.oracle.com 网站享誉 Oracle 界数十年,绝非幸致.最近在图书 ...
- java三篇博客转载 详解-vector,stack,queue,deque
博客一:转载自http://shmilyaw-hotmail-com.iteye.com/blog/1825171 java stack的详细实现分析 简介 我们最常用的数据结构之一大概就是stack ...
- SOS: gnuplot fdtd的一个问题求助 perl vs python
我用perl和python写了相同功能的一段程序,计算一维fdtd,用gnuplot动态显示,可是python的数据没有显示出来,看横纵坐标的变化数据是正确收到了的,如最后的图片,求大神指点,谢谢. ...
- nginx 一二事(3) - 反向代理以及负载均衡
先来说说正向代理 就是普通的代理,记得高中年代偷跑去网吧是要办卡的 题外话: 就是这货...相信很多80同龄人都有吧... 回到正题,那正向代理就不让你直接访问网络,而需要登录一下网吧的某个系统 ...
- java 21 - 7 IO流小结的图解