Linq基础知识小记二
书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法.
1、方法语法
方法语法就是通过扩展方法和Lambda表达式来创建查询
(1)、链式查询
这种查询方式很多语言都支持,通过一段实例,介绍Linq的链式查询.需求如下:找出字符串数组中含有字母e的字符穿,并按长度排序,最后将结果转为大写.代码如下:
string[] names = {"James","Kobe","Curry","Durrent" };
IEnumerable<string> result = names.Where(n =>n.Contains('e')).OrderBy(n => n.Length)
.Select(n => n.ToUpper());
foreach (var n in result)
{
Console.WriteLine(n);
}
链式查询的原理:一个词"扩展方法",核心是扩展方法,因为where、OrderBy、Select等扩展方法返回都是一个IEnumerable<T>类型对象,所以配合扩展方法本身的特殊性(不懂,请参考C# this关键字(给底层类库扩展成员方法)就实现了链式查询的功能.关于这个如果了解jQuery链式查询的可能更容易理解.
(2)、OrderBy、Where、Selet查询方法简单介绍
Where:该方法决定了过滤的规则,也就是按照Where方法中Lambda制定的规则,当前element是否能继续留在数据集合中.
OrderBy:按照Lambda制定的规则对数据集合进行排序.
Select:按照Lambda制定的规则决定了当前数据集合要以怎样的方式输出.
(3)、方法语法中除了Select、OrderBy、Where的其它查询操作符
并不是所有的查询运算符都返回一个IEnumerable<T>,所以使用这类查询操作符之后不能使用其他的查询操作符,这类查询一般出现在查询的最后.如下:
int[] numbers = {, , , , , , , , };
int first = numbers.First(n=>n>);//找出复合Lambda规则的第一个数字,如果不传Lambda,则默认找出目标数组的第一个,注:这里并不会大小上的第一个,而是位置上的第一个
int last = numbers.Last(n=>n>);//同理,但它是找出最后一个
int firstOne = numbers.OrderBy(n=>n).First(n => n > );//对数组进行排序,排序后找出大于500的第一个数
int elementAt = numbers.ElementAt();//找出位于数组第三个的数
Console.WriteLine(first + " " +last+" "+firstOne+" "+ elementAt);

还有一些特殊的运算符接收输入两个数据集,如Union和Concat,如下:
int[] arr1 = {,,,,,};
int[] arr2 = {, , , , , };
IEnumerable<int> result = arr1.Concat(arr2);//联结两个数组,不去重
IEnumerable<int> result1 = arr1.Union(arr2);//联结两个数组,去重
foreach (var n in result)
{
Console.Write(n + " ");
}
Console.WriteLine();
foreach (var n in result1)
{
Console.Write(n+" ");
}

关于类似的方法还有很多,推荐去研究下System.Linq.Enumerable类
2、Linq查询表达式语法
Linq查询表达式语法写出的查询比较类似与Sql语句,是C#3.0加入的,虽然Linq查询表达式看上去类似于Sql查询,但实际上它并不是建立在Sql语句上,而是建立在函数式编程语言如LISP和Haskell中的list comprehensions(列表解析)功能之上,也就是所编译器会对Linq查询表达式进行处理,并编译成扩展方法,实质也是在使用扩展方法进行查询.
下面对1中链式查询的的例子进行改写,使用Linq查询表达式语法,代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var result = from n in names
where n.Contains("e")
orderby n.Length
select n.ToUpper();
foreach (var n in result)
{
Console.WriteLine(n);
}

查询表达式总是已From子句开始,From子句定义了查询的范围变量,改变量其实就是对数据集合的一个遍历,就像foreach语句那样.

上图是标准的查询表达式语法图
3、组合查询语法
因为查询表达式语法和扩展方法语法各有所长,其实本质上查询表达式编译之后也是一种方法语法,两者是真包含的关系,所以使用起来可以根据自身的喜好来决定,但是当一个查询操作运算符没有对应的查询表达式语法时,那么就需要结合两种方法,来得到我们想要的结果,如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var result = (from n in names where n.Contains("J") select n).Count();//查询name集合中包含字母J的字符串个数
Console.WriteLine(result);
这种组合语法通常在书写更加复杂的查询时会具有优势。像上面这种简单的查询可能使用方法语法就够了.
Linq基础知识小记二的更多相关文章
- Linq基础知识小记四之操作EF
1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...
- Linq基础知识小记三
1.子查询 Linq中的子查询思想和Sql中的子查询其实差不多, 对于方法语法,一个子查询包含在另一个子查询的Lambda表达式中,代码如下: string[] names = { "Jam ...
- Linq基础知识小记一
1.LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据.广义的数据包括XML文档数据.元数据.System.Data.dll和System.Data.S ...
- EF基础知识小记二
1.EF的常用使用场景 (1).维护一个已经存在的数据库,VS提供了工具帮助我们把数据库中的表和视图等对象导入到实体框架. [数据库=>模型(Database First)] (2 ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
- EF基础知识小记四(数据库=>模型设计器)
EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...
- LeetCode刷题191130 --基础知识篇 二叉搜索树
休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...
- Ajax基础知识(二)
接上一篇 Ajax基础知识(一) 在上一篇博客里,抛弃了VS中新建aspx页面,拖个button写上C#代码的方式.使用ajax的方式,异步向服务器请求数据.我们让服务器只简单的返回一个" ...
- HTTP基础知识(二)
接着上一章的内容:HTTP基础知识(一) 二.简单的HTTP协议 1.客户端:请求访问文本或图像等资源的一端称为客户端: 服务器端:提供资源响应的一端 2.以百度为例子 这是请求头: 在起始行 ...
随机推荐
- JPEG Camer 图片上传
/* Linksprite */ #include <SoftwareSerial.h> #include <Ethernet.h> #include <SPI.h> ...
- UVaLive 6525 Attacking rooks (二分图最大匹配)
题意:给定一个 n * n的图,X是卒, . 是空位置,让你放尽量多的车,使得他们不互相攻击. 析:把每行连续的 . 看成X集体的一个点,同理也是这样,然后求一个最大匹配即可. 代码如下: #prag ...
- Redis总结和提取常用的和重要的命令
一:Redis的结构和其数据类型(注redis默认端口号是6379) 1)Redis可以部署多套(多个进程不同端口或直接部署在不同主机),每个Redis都可以有多个db,通过select来选择,默认的 ...
- Tensorflow从源代码编译2
https://blog.csdn.net/qq_37674858/article/details/81095101 https://blog.csdn.net/yhily2008/article/d ...
- HDU2212 DFS 2016-07-24 13:52 56人阅读 评论(0) 收藏
DFS Problem Description A DFS(digital factorial sum) number is found by summing the factorial of eve ...
- underscore utility
1._.noConflict:命名冲突处理方法 _.noConflict = function() { root._ = previousUnderscore; //返回this不错 return t ...
- spring集成struts2
Struts2前身是WebWork,核心并没有改变,其实就是把WebWork改名为struts2,与Struts1一点关系没有. Struts2中通过ObjectFactory接口实现创建及获取Act ...
- Delphi 动态与静态调用DLL(最好的资料)
摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例. 一.动态链接库的概念 动态链接库( ...
- [leetcode] 15. Plus One
这道题其实让我意识到了我的英文水平还有待加强.... 题目如下: Given a non-negative number represented as an array of digits, plus ...
- Android-Android/APP-理解
Android 1.Google Android 给出的官方Android架构图就是大家都知道的四层,第一层是应用层(就是很多能够看得到的应用),第二层是应用框架层(为application提 供各种 ...