背景

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

注意事项

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

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

引用包:System.Linq

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

Where

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

例子:

            StringBuilder str = new StringBuilder();
foreach (int item in list.Where(d => d % == ))
{
str.Append(item);
}

老式IF用法:

            StringBuilder str = new StringBuilder();
foreach (int item in list)
{
if (item % == )
{
str.Append(item);
}
}

Take

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

例子:

            var list = Enumerable.Range(, );

            foreach (int item in list.Take())
{
Console.WriteLine(item.ToString());
}

Select

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

例子:

            var list = new List<Animal> {
new Animal{ Name="hot dog",Sex=,Age=},
new Animal{ Name="big dog",Sex=,Age=},
new Animal{ Name="bin dog",Sex=,Age=},
new Animal{ Name="baby dog",Sex=,Age=},
}; 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 * , 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 * ))
{
Console.WriteLine(item.ToString());
}

结果:

SelectMany

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

例子:

            var parameters = new Parameter[]
{
new Parameter() { Name = "正一", Numbers = new int[] { , , } },
new Parameter() { Name = "清次", Numbers = new int[] { , , } },
new Parameter() { Name = "誠三", Numbers = new int[] { , , } },
new Parameter() { Name = "征史", Numbers = new int[] { , , } },
}; StringBuilder str = new StringBuilder();
var result = parameters.SelectMany(value => value.Numbers);
foreach (int value in result)
{
str.Append($"{value},");
}
Console.WriteLine(str.ToString());

结果:

如果使用Select就是如下写法:

            var parameters = new Parameter[]
{
new Parameter() { Name = "正一", Numbers = new int[] { , , } },
new Parameter() { Name = "清次", Numbers = new int[] { , , } },
new Parameter() { Name = "誠三", Numbers = new int[] { , , } },
new Parameter() { Name = "征史", Numbers = new int[] { , , } },
}; var results = parameters.Select(value => value.Numbers); StringBuilder str = new StringBuilder();
foreach (int[] values in results)
{
foreach (int number in values)
{
str.Append($"{number},");
}
}
Console.WriteLine(str.ToString());

结果:

Distinct

去掉重复数据留下一个,一般用于基础数据类型。如果是类需要指定比较方法。

            int[] dataA = new int[] { , , , ,  };
List<float> dataB = new List<float>() { 1.5f, 1.5f, 1.5f, 1.5f }; IEnumerable<int> dataA_D = dataA.Distinct();
IEnumerable<float> dataB_D = dataB.Distinct(); foreach (var d in dataA_D)
{
Console.WriteLine(d);
}
foreach (var d in dataB_D)
{
Console.WriteLine(d);
}

Any

用来判断列表是否为空,速度比Count()快。如果是类,可以指定判断条件。

            int[] numbersA = new int[] { };
int[] numbersB = new int[] { , , , , , , , , , }; var list = new List<Animal> {
new Animal{ Name="hot dog",Sex=},
new Animal{ Name=null,Sex=},
new Animal{ Name="bin dog",Sex=},
new Animal{ Name="baby dog",Sex=},
}; Console.WriteLine(numbersA.Any());
Console.WriteLine(numbersB.Any());
Console.WriteLine(list.Any(a => a.Name == null));

Join

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

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>( this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector );

参数说明:

outer:结合的数据列表A

inner:结合的数据列表B

outerKeySelector:列表A的主键字段

innerKeySelector:列表B的主键字段

resultSelector:返回结果定义。(匿名类居多)

            PersonData[] persons = new PersonData[]
{
new PersonData() { Name = "正一郎", ItemID = },
new PersonData() { Name = "清次郎", ItemID = },
new PersonData() { Name = "誠三郎", ItemID = },
new PersonData() { Name = "征史郎", ItemID = },
}; ItemData[] items = new ItemData[]
{
new ItemData() { ID = , Name = "金" },
new ItemData() { ID = , Name = "権力" },
}; var joinList = persons.Join(
items,
person => person.ItemID,
item => item.ID,
(person, item) => new { PersonName = person.Name, ItemName = item.Name }); foreach (var item in joinList)
{
Console.WriteLine($"Person:{item.PersonName}, Item:{item.ItemName}");
}

Except

求两个数据列表的差分集合用。

            int[] numbersA = new int[] { , , , ,  };
int[] numbersB = new int[] { , , , , }; IEnumerable<int> results = numbersA.Except(numbersB);
foreach (var d in results)
{
Console.WriteLine(d);
}

自定义比较条件的情况

    class Parameter
{
public int ID { get; set; }
public string Name { get; set; } public override string ToString()
{
return string.Format("ID:{0}, Name:{1}", ID, Name);
}
}
class ParameterComparer : IEqualityComparer<Parameter>
{
public bool Equals(Parameter i_lhs, Parameter i_rhs)
{
if (i_lhs.ID == i_rhs.ID &&
i_lhs.Name == i_rhs.Name)
{
return true;
}
return false;
} public int GetHashCode(Parameter i_obj)
{
return i_obj.ID ^ i_obj.Name.GetHashCode();
}
} class Program
{
static void Main(string[] args)
{
Parameter[] dataA = new Parameter[]
{
new Parameter() { ID = , Name = "正一郎" },
new Parameter() { ID = , Name = "清次郎" },
new Parameter() { ID = , Name = "誠三郎" },
new Parameter() { ID = , Name = "征史郎" },
};
Parameter[] dataB = new Parameter[]
{
new Parameter() { ID = , Name = "清次郎" },
new Parameter() { ID = , Name = "誠三郎" },
new Parameter() { ID = , Name = "征史郎" },
}; ParameterComparer compare = new ParameterComparer();
IEnumerable<Parameter> results = dataA.Except(dataB, compare); foreach (var item in results)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}

Range

指定开始位置,指定个数的连续列表做成。

            IEnumerable<int> intSequenceA = Enumerable.Range(, );
IEnumerable<int> intSequenceB = Enumerable.Range(-, );
IEnumerable<int> intSequenceC = Enumerable.Range(, ); foreach (var d in intSequenceA)
{
Console.WriteLine(d);
}
Console.WriteLine("=========");
foreach (var d in intSequenceB)
{
Console.WriteLine(d);
}
Console.WriteLine("=========");
foreach (var d in intSequenceC)
{
Console.WriteLine(d);
}

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

常用LINQ关键字用法汇总的更多相关文章

  1. C++ STL常用容器基本用法汇总

    1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...

  2. numpy中的一些常用的关键字用法

    1.np.full() 原型:numpy.full(shape, fill_value, dtype=None, order='C') eg: 2.np.flatten():该函数返回一个折叠成一维的 ...

  3. Linux常用到的指令汇总

    Linux常用到的指令汇总 根据鸟哥linux私房菜上定义的:一定要先學會的指令:ls, more, cd, pwd, rpm, ifconfig, find 登入與登出(開機與關機):telnet, ...

  4. jquery常用函数与方法汇总

    1.delay(duration,[queueName]) 设置一个延时来推迟执行队列中之后的项目. jQuery1.4新增.用于将队列中的函数延时执行.他既可以推迟动画队列的执行,也可以用于自定义队 ...

  5. PHP中public,private,protected,abstract等关键字用法详解

    PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...

  6. Robotframework 之常用断言关键字简介

    任何自动化测试框架或实例中断言是必不可少的,Robotframework同样如此,那下面就介绍下其常用断言关键字. 1.Should Be Empty   判断是否为空,如果不为空,执行失败,示例: ...

  7. C#中DllImport用法汇总

    最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享. 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比 ...

  8. Mysql常用运算符与函数汇总

    Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...

  9. C#中var关键字用法分析

    原文连接 本文实例分析了C#中var关键字用法.分享给大家供大家参考.具体方法如下: C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当 ...

随机推荐

  1. php 多维数组 array sort 排序 :array_multisort

    1.参考链接: php简单实现多维数组排序的方法 参考二: 这个链接很好,可以直接看这个:PHP array_multisort—对多个数组或多维数组进行排序 2.案例一: //13: 最佳: pub ...

  2. mysql远程访问1045的问题解决

    mysql远程访问1045的问题解决 首先进入mysql数据库,然后输入下面两个命令 grant all privileges on *.* to 'root'@'%' identified by ' ...

  3. linux安装虚拟机ping不通网关,ping不通外网问题解决(nat模式)

    1.将网关字段改成自己想要的字段

  4. Always an Integer 数论和字符串处理

    题意:判断一个整系数多项式除以一个常数结果是否一定是一个整数 大白p123例题.可以随机代入一些n的值,判断一下.不过只要代入1到k+1(k为多项式最高项的次数)即可.通过数学归纳法证明,先讨论k为0 ...

  5. select默认显示

    select默认显示第一个option,但大部分需求都是显示一个请选择,点击后在显示option的内容. 就像上图一样 但如果正常写的话会是像下面这样显示 请选择也会显示在下拉款里面,这样就很不友好 ...

  6. Windows 下Redis的部署 及key 过期事件

    window下Redis部署,下载安装完成之后,进入到redis目录: 1.修改配置文件redis.windows.service.conf配置密码 requirepass myRedis (注意在R ...

  7. C#/对线程的认识

    1.线程的优点和缺点,以及什么时候来考虑使用线程.多线程可以使得程序响应更快,程序在进行其他任务的同时,线程也处于活动状态.当前没有处理任务的时候,可以把处理器的时间让给其他任务可以随时停止任务可以设 ...

  8. Charles Map Local 中文显示乱码问题

    最近在迁移客户端的业务,用React Native实现,在用本地数据测试Android的时候,遇到到中文乱码的问题.是因为编码问题. 一.首先看看文件编码是否是UTF-8,我的电脑是安装了Sublim ...

  9. 1. ReactJS基础(开发环境搭建)

    本文主要介绍通过React官方提供的create-react-app脚手架进行开发环境的搭建. 1.安装node环境(安装过程这里不做介绍,可参考其他博文) 在cmd中输入node -v 如果可以看到 ...

  10. 远程过程调用发展历程 WebAPI GRPC Hprose

    作者:马秉尧链接:https://www.zhihu.com/question/23299132/answer/109978084来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...