常用LINQ关键字用法汇总
背景
传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 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关键字用法汇总的更多相关文章
- C++ STL常用容器基本用法汇总
1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...
- numpy中的一些常用的关键字用法
1.np.full() 原型:numpy.full(shape, fill_value, dtype=None, order='C') eg: 2.np.flatten():该函数返回一个折叠成一维的 ...
- Linux常用到的指令汇总
Linux常用到的指令汇总 根据鸟哥linux私房菜上定义的:一定要先學會的指令:ls, more, cd, pwd, rpm, ifconfig, find 登入與登出(開機與關機):telnet, ...
- jquery常用函数与方法汇总
1.delay(duration,[queueName]) 设置一个延时来推迟执行队列中之后的项目. jQuery1.4新增.用于将队列中的函数延时执行.他既可以推迟动画队列的执行,也可以用于自定义队 ...
- PHP中public,private,protected,abstract等关键字用法详解
PHP中常用的关键字 在PHP中包含了很多对函数和类进行限制的关键字,常用的通常有abstract,final,interface,public,protected,private,static等等, ...
- Robotframework 之常用断言关键字简介
任何自动化测试框架或实例中断言是必不可少的,Robotframework同样如此,那下面就介绍下其常用断言关键字. 1.Should Be Empty 判断是否为空,如果不为空,执行失败,示例: ...
- C#中DllImport用法汇总
最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享. 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比 ...
- Mysql常用运算符与函数汇总
Mysql常用运算符与函数汇总 本文给大家汇总介绍了mysql中的常用的运算符以及常用函数的用法及示例,非常的全面,有需要的小伙伴可以参考下 我们先把数据表建好 use test;create tab ...
- C#中var关键字用法分析
原文连接 本文实例分析了C#中var关键字用法.分享给大家供大家参考.具体方法如下: C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当 ...
随机推荐
- java并发中的Semaphore
什么是Semaphore Semaphore可以控制某个资源可被同时访问的个数(locks和synchronized锁,在任何时刻只允许一个任务访问一个资源),通过acquire()获取一个许可,如果 ...
- 制作一个老旧C118的GSM便携式测试设备
对于OsmocomBB也是被国内外大神玩得不亦乐乎.什么重定向攻击,中间人攻击.都是N年前的东西咯.当然鄙人不会这些.对于地下市场无非就是获取对方短信小则“老.虎.机”,大则支付宝.某日翻了翻“咸”鱼 ...
- 今天遇到一个关于栈溢出的问题StackOverflowError
关于这个问题个人认为是一个比较棘手的问题,因为我们每个人遇到溢出问题的原因都不一样,所以遇到这样的问题就多从问题的根本入手. 我遇到的原因是,循环多次导致的,以为我的俩个互相关联的实体类,当作查询时, ...
- L2-002 链表去重 (25 分)
L2-002 链表去重 (25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在 ...
- 【Python】关于decode和encode
#-*-coding:utf-8 import sys ''' *首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码, 即先将 ...
- Python学习第六课
Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...
- git同步遇到报错
git同步遇到报错 “fatal: unable to access ‘https://github.com/ruanwenwu/newp.git/‘: Peer reports incompatib ...
- 在虚拟机上利用宿主机共享目录编译linux程序
#前提条件: 宿主机:windows7 虚拟机:REDHAT 开发环境 qt4.7.4 +vs2010 . 代码在windows7 上编译成功 ,运行正常 在linux下编译需要的第三方库已经编译成功 ...
- two pointers
two pointers是算法编程中一种非常重要的思想,但是很少会有教材单独拿出来将,其中一个原因是它更倾向于是一种编程技巧,而长得不太像是一个是“算法”的模样.two pointers的思想十分简介 ...
- 测试那些事儿—LR脚本插入DOS命令
1.基础命令 dir 查看当前目录下的文件和文件夹 cd 目录名:进入特定的目录. md 路径名:建立特定的文件夹. rd 路径名:删除特定的文件夹. cls:清除屏幕. copy 路径\文件名 ...