常用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而来, 由编译器帮我们推断具体的类型.总体来说,当 ...
随机推荐
- zabbix添加IIS网站计数器(并发连接数)详解
环境:windows server 2012 前提:IIS上要添加好配置 1,在被监控主机,powershell输入perfmon.msc 2,点击添加按钮 3,在下拉菜单中点击小箭头 ...
- Python matplotlib绘图学习笔记
测试环境: Jupyter QtConsole 4.2.1Python 3.6.1 1. 基本画线: 以下得出红蓝绿三色的点 import numpy as npimport matplotlib. ...
- MAC IDEA mybatis 逆向工程 无结果文件
mac下路径是./src windows 路径是.\src 解决方法,将\纠正过来即可
- [C# 基础知识系列]专题三:如何用委托包装多个方法——委托链 (转载)
引言: 上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一个方法,那委托能不能封装多个方法呢?因为生活中经常会听到, ...
- iOS .tbd
http://stackoverflow.com/questions/31450690/why-xcode-7-shows-tbd-instead-of-dylib http://www.jiansh ...
- JdbcTemplate 配置多数据源(完全照抄,完整)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- SublimeText 3200 package Control 安装
写一点自己的坑 花了2个小时时间才弄好 先上干货 https://github.com/wbond/package_control 这里直接 Clone zip 解压 后将整个文件夹改名为 " ...
- 采用NoteExpress参考文献导入和导出
1.NoteExpress使用 该软件分为企业版和个人版,但目前看来个人版已经不能用了,我用的是我们学校购买的软件,感觉还是很方便的. (1)首先建立数据库: (2)可以通过导入原文选项将下载好的文章 ...
- mysql启动报错 mysql InnoDB: Error: could not open single-table tablespace file
mysql启动不成功,报错 mysql InnoDB: Error: could not open single-table tablespace file innodb_force_recovery ...
- 选择器与I/O多路复用
Selector选择器是NIO技术中的核心组件,可以将通道注册进选择器中,其主要作用是使用1个线程来对多个通道中的已就绪通道进行选择,然后就可以对选择的通道进行数据处理,属于一对多的关系,也就是使用1 ...