Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

常用LINQ关键字用法汇总

云中客 2019-02-19 12:54:00 阅读数:191 评论数:0 点赞数:0 收藏数:0

背景

传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,还需要针对每种数据源学习一种不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等等。 LINQ 使查询成为 C/# 中的一流语言构造。 可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。

注意事项

版本需求:.NET Framework 3.5 或更高版本

查询对象:SQL Server 数据库、XML 文档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerable 接口的任何对象集合

引用包:System.Linq

以下按照使用度排序介绍。

Where

用于过滤数据,减少IF分支语句。

例子:StringBuilder str = newStringBuilder();foreach (int item in list.Where(d => d % 2 == 0)) { str.Append(item); }

老式IF用法:

StringBuilder str = newStringBuilder();foreach (int item inlist) {if (item % 2 == 0) { str.Append(item); } }

Take

从数据源开始位置读取指定的元素个数用。

例子:var list = Enumerable.Range(1, 100000);foreach (int item in list.Take(10)) { Console.WriteLine(item.ToString()); }

Select

抽取数据源中类型的指定元素组建成新的类型。主要用于简化数据列或者转换数据类型,以及获取元素Index。

例子:var list = new List{new Animal{ Name="hot dog",Sex=1,Age=10},new Animal{ Name="big dog",Sex=0,Age=11},new Animal{ Name="bin dog",Sex=0,Age=12},new Animal{ Name="baby dog",Sex=1,Age=13}, };foreach (string item in list.Select(a =>a.Name)) { Console.WriteLine(item.ToString()); }foreach (var item in list.Select(a => new { Name = a.Name, Length = a.Age / 2, Type = "S"})) { Console.WriteLine(item.ToString()); }foreach (var item in list.Select((value, index) => new { Number = index, Name =value })) { Console.WriteLine(item.ToString()); }foreach (string item in list.Select(a => a.Sex.ToString("D2"))) { Console.WriteLine(item.ToString()); }foreach (int item in list.Select(a => a.Age / 2)) { Console.WriteLine(item.ToString()); }

结果:

SelectMany

将数据源降维抽取,减少For循环。类似Select,适合多重子集的数据源抽取数据。

例子:var parameters = newParameter[] {new Parameter() { Name = "正一", Numbers = new int[] { 1, 2, 3} },new Parameter() { Name = "清次", Numbers = new int[] { 1, 3, 5} },new Parameter() { Name = "誠三", Numbers = new int[] { 2, 4, 6} },new Parameter() { Name = "征史", Numbers = new int[] { 9, 8, 7} }, }; StringBuilder str= newStringBuilder();var result = parameters.SelectMany(value =>value.Numbers);foreach (int value inresult) { str.Append($"{value},"); } Console.WriteLine(str.ToString());

结果:

如果使用Select就是如下写法:var parameters = newParameter[] {new Parameter() { Name = "正一", Numbers = new int[] { 1, 2, 3} },new Parameter() { Name = "清次", Numbers = new int[] { 1, 3, 5} },new Parameter() { Name = "誠三", Numbers = new int[] { 2, 4, 6} },new Parameter() { Name = "征史", Numbers = new int[] { 9, 8, 7} }, };var results = parameters.Select(value =>value.Numbers); StringBuilder str= newStringBuilder();foreach (int[] values inresults) {foreach (int number invalues) { str.Append($"{number},"); } } Console.WriteLine(str.ToString());

结果:

Distinct

去掉重复数据留下一个,一般用于基础数据类型。如果是类需要指定比较方法。int[] dataA = new int[] { 0, 1, 3, 3, 2}; List dataB = new List() { 1.5f, 1.5f, 1.5f, 1.5f}; IEnumerable dataA_D =dataA.Distinct(); IEnumerable dataB_D =dataB.Distinct();foreach (var d indataA_D) { Console.WriteLine(d); }foreach (var d indataB_D) { Console.WriteLine(d); }

Any

用来判断列表是否为空,速度比Count()快。如果是类,可以指定判断条件。int[] numbersA = new int[] { };int[] numbersB = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};var list = new List{new Animal{ Name="hot dog",Sex=1},new Animal{ Name=null,Sex=0},new Animal{ Name="bin dog",Sex=0},new Animal{ Name="baby dog",Sex=1}, }; Console.WriteLine(numbersA.Any()); Console.WriteLine(numbersB.Any()); Console.WriteLine(list.Any(a=> a.Name == null));

Join

两组数据结合。也可以用来根据某个表排序数据。

public static IEnumerable Join( this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func resultSelector );

参数说明:

outer:结合的数据列表A

inner:结合的数据列表B

outerKeySelector:列表A的主键字段

innerKeySelector:列表B的主键字段

resultSelector:返回结果定义。(匿名类居多)PersonData[] persons = newPersonData[] {new PersonData() { Name = "正一郎", ItemID = 0},new PersonData() { Name = "清次郎", ItemID = 1},new PersonData() { Name = "誠三郎", ItemID = 2},new PersonData() { Name = "征史郎", ItemID = 0}, }; ItemData[] items= newItemData[] {new ItemData() { ID = 0, Name = "金"},new ItemData() { ID = 1, Name = "権力"}, };var joinList =persons.Join( items, person=>person.ItemID, item=>item.ID, (person, item)=> new { PersonName = person.Name, ItemName =item.Name });foreach (var item injoinList) { Console.WriteLine($"Person:{item.PersonName}, Item:{item.ItemName}"); }

Except

求两个数据列表的差分集合用。int[] numbersA = new int[] { 1, 2, 3, 4, 5};int[] numbersB = new int[] { 8, 6, 4, 2, 0}; IEnumerable results =numbersA.Except(numbersB);foreach (var d inresults) { Console.WriteLine(d); }

自定义比较条件的情况classParameter {public int ID { get; set; }public string Name { get; set; }public override stringToString() {return string.Format("ID:{0}, Name:{1}", ID, Name); } }class ParameterComparer : IEqualityComparer{public boolEquals(Parameter ilhs, Parameter irhs) {if (ilhs.ID == irhs.ID &&ilhs.Name==irhs.Name) {return true; }return false; }public intGetHashCode(Parameter iobj) {return iobj.ID ^i_obj.Name.GetHashCode(); } }classProgram {static void Main(string[] args) { Parameter[] dataA= newParameter[] {new Parameter() { ID = 0, Name = "正一郎"},new Parameter() { ID = 5, Name = "清次郎"},new Parameter() { ID = 3, Name = "誠三郎"},new Parameter() { ID = 9, Name = "征史郎"}, }; Parameter[] dataB= newParameter[] {new Parameter() { ID = 5, Name = "清次郎"},new Parameter() { ID = 3, Name = "誠三郎"},new Parameter() { ID = 2, Name = "征史郎"}, }; ParameterComparer compare= newParameterComparer(); IEnumerable results =dataA.Except(dataB, compare);foreach (var item inresults) { Console.WriteLine(item.ToString()); } Console.ReadKey(); } }

Range

指定开始位置,指定个数的连续列表做成。IEnumerable intSequenceA = Enumerable.Range(1, 5); IEnumerable intSequenceB = Enumerable.Range(-1, 3); IEnumerable intSequenceC = Enumerable.Range(100, 4);foreach (var d inintSequenceA) { Console.WriteLine(d); } Console.WriteLine("=========");foreach (var d inintSequenceB) { Console.WriteLine(d); } Console.WriteLine("=========");foreach (var d inintSequenceC) { Console.WriteLine(d); }

备注:https://www.urablog.xyz/entry/2018/07/10/070000

版权声明
本文为[云中客]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/lixiaobin/p/linqMethod.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领