C#之LINQ

出来事情学习的越来越多了,对C#也是明白越来越深,总是想找个时间总结一下自己学过的器械,文字纪录,经常翻看,查缺补漏的让自己不至于变得善忘,遂就有了此系列,权当温习牢固之用。




一、概述




1.什么是Linq?

不管我们举行什么项目的开发,跟数据打交道绝对是绕不过去的,有了数据,我们难免要去操作数据,大量的数据给我们带来了操作的贫苦,.net为了解决这个问题,在 .NET Framework 3.5 版中引入的一项创新功效,它在工具领域和数据领域之间架起了一座桥梁,它就是LINQ(Language Integrated Quary)。




2.哪些工具能使用Linq?

在 C# 中可为以下工具编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerable 接口的任何工具聚集。然则使用的Linq项目的Framework 必须是3.5及以上的。
C#之LINQ




二.常见尺度查询运算符




1.Select

此方式将序列中的每个元素投影到新表单。
例:C#之LINQ




2.where

此方式基于谓词筛选值序列。
我们可以对数据举行筛选

	var query = table.where(x => x.name == "Tom");

同时也提供了按序号举行筛选,index从0最先

	var query = table.where((x, index)=> index >= start && index <= end);




3.First()、FirstOrDefault()、Last()和LastOrDefault()

与Where()类似,但差别的是First()只会返回知足条件的第一个序列元素,若是元素不存在时,First()会抛出异常,FirstOrDefault()则是会返回元素的默认值。
Last()、LastOrDefault()与First()、FirstOrDefault()正好相反,它们返回序列中相符条 件的最后一个元素,若是元素不存在时,Last()会抛出异常,LastOrDefault()则是会返回元素的默认值

int[] array = {1, 2, 3, 4};
int item = array.First(x=>x%2 == 0);//2
int item = array.FirstOrDefault(x=>x == 5);//0
int item = array.Last();//4
int item =  array.LastOrDefault();//4




4.Single()和SingleOrDefault()

Single()与First()类似。然则Single()要求序列中有且只有一个知足条件的项,否则抛出异常,SingleOrDefault()在无知足条件项时,返回默认值。

int[] array = {1, 2};
int item = array.Single();//抛出异常




5.Distinct()

多数数人一看到这个词就知道他的用法,Distinct()用于提出序列中重复的数据,并返回其余的所有数据。如:

int[] array = {2,2,3,3,4,4,5,5};
var query = array.Distinct();//[2,3,4,5]




6.Cast()

Cast用于将非泛型序列转换为泛型序列 IEnumerable 。当某一序列项无法乐成转换时,则会抛出异常

ArrayList list = new ArrayList();
list.Add(1);
list.Add("二");
var query=list.Cast<int>();//异常:  System.InvalidCastException: 指定的转换无效




7.GroupBy()

跟在sql中作用一致,GroupBy()就是用作分组的。
GroupBy()返回了一个IEnumerable<IGrouping<TKey,TSource>>的捏词类型,我们查看接口可知,这个,IGrouping<TKey,TSource>也是一个序列,只是多了一个Key属性,而且依据 Key举行了分组。

优秀DevOps工程师必会的33个面试题




8.Intersect()和Except()

Intersect()返回两个序列中相同元素组成的序列,如:

int[] array1 = { 2,3,4,5};
int[] array2 = {2,3,6,7};
var query = array1.Intersect(array2);//2,3

Except(),则是返回第一个序列中有而第二个序列中没有的数据,如:

int[] array1 = { 2,3,4,5};
int[] array2 = {2,3,6,7};
var query = array1.Except(array2);//4,5




9.OrderBy()、ThenBy()、OrderByDescending()和ThenByDescending()

OrderyBy与OrderByDescending()很好明白,一个是升序一个是降序排列。如:

var query = table.OrderBy(x=>x.time);//对时间举行升序排列
var queryDesc = table.OrderByDescending(x=>x.time);//对时间举行降序排列

那么ThenBy()与ThenByDescending是干嘛用的呢?当我们需要一个较为庞大的排序,先按时间举行排序,再按名字举行排序,那么我们此时就要用到这两个方式了。由于ThenBy()是在IOrderedEnumerable 上界说的扩展方式,因此不能直接在IEnumrable 上挪用,而在这四个排序方式返回的都是IOrderedEnumerable ,故可以在后面直接挪用。




10.Take()、TakeWhile()、Skip()和SkipWhile()

Take()方式返回原序列中的前N个元素组成的新序列,如:

var query = table.Take(3);//取前3个元素

TakeWhile()会取出延续知足条件的数据,直到遇到第一个不知足的数据。
Skip()则是跳过前N个元素,如:

var query = table.Skip(3);//跳过前三个返回后面的数据

SkipWhile() 会一直跳过延续知足条件的数据,直到遇到第一个不知足的数据就返回该元素之后的所有元素组成的序列。
Take()与Skip()这两个运算符在Linq to sql 中常用作分页。如:

var query = table.Skip(10).Take(10);//每页10条数据,显示第二页数据




11.Zip()

Zip()对两个序列中位置相同的两个元素举行操作,基于两个元素的操作效果返回一个新 的元素。若是两个序列的长度不相等,则以长度短的为准。如:


int[] array1 = { 1, 2, 3, 4, 5 }; 
string[] array2 = { "星期一", "星期二", "星期三" }; 
var query = array1.Zip(array2, (x,y) => String.Format("{0},{1}", x, y));
返回效果为:
1,星期一 
2,星期二 
,星期三




12.Concat()和Union()

Concat()运算符用于毗邻两个序列。如:

int[] array1 = { 3, 1, 2 };
int[] array2 = { 2, 3, 5 };
var query = array1.Concat(array2);//  3,1,2,2,3,5

Union()运算符也用于毗邻两个序列,然则会剔除相同的项目。如:

int[] array1 = { 3, 1, 2 };
int[] array2 = { 2, 3, 5 };
var query = array1.Union(array2);//  3,1,2,5




13.Contains()、Any()

Contains()判断某一个元素是否存在于序列中,Any()则是判断序列中是否存在知足表达式的元素,两者返回的都是bool,知足则返回true。




总结

Linq在我们需要操作数据的代码中应用频仍,它具有延迟加载的观点,只有在数据上挪用聚合函数时才会执行查询操作,对我们许多操作都提供了极大地便利。学好Linq在EF等ORM框架中也能更快速的开发。
本文借鉴了张子阳先生的《net之美》第五章LINQ的部分内容,在此表示感谢。

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/3119.html