背景

传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 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. 【原创】Aduino小车玩法全记录

    本来打算用一周时间好好研究下基于Arduino开发板的小车实验,结果实际上两天就完成了小车可玩的各种功能,包括完成特定动作组合,黑线循迹,(带后退)红外避障和(带舵机)超声波避障,超声波测距,红外遥控 ...

  2. Python 多进程和多线程的效率对比

    import time from threading import Thread from multiprocessing import Process def f1(): # time.sleep( ...

  3. QWaiteCondition思考4

    引用 http://blog.csdn.net/flyoxs/article/details/54617342 简单用法 QWaitCondition 用于多线程的同步,一个线程调用QWaitCond ...

  4. 2018-2019-2 网络对抗技术 20165228 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165228 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件( ...

  5. Tomcat生成的session持久化到MySQL

    Telling Tomcat to save session records in MySQL 此部分内容摘自 MySQL cookbook 3th.具体内容不做翻译,哈哈,懒 The default ...

  6. Codeforces Hello 2018 E题Logical Expression dp+最短路 好题

    j题目链接: http://codeforces.com/contest/913/problem/E 题意: 给你x,y,z三个变量,与&   或|  非!  括号()   四种运算符,规定括 ...

  7. 【leetcode】476. Number Complement

    problem 476. Number Complement solution1: class Solution { public: int findComplement(int num) { //正 ...

  8. linux nginx 如何配置多个端口

    在linux下发布.netcore 应用,并使用nginx进行反向代理,参照博客园文章 https://www.cnblogs.com/ants/p/5732337.html#autoid-7-3-0 ...

  9. Mysql数据库账户权限设置

    1.修改mysql数据库的root密码: 修改 数据库.表名 SET password=加密(‘密码’) where user=’root’; UPDATE mysql.user SET passwo ...

  10. C#实现按键计算器功能

    C#实现按键计算器功能 (一次失败的编程) 界面: 代码如下: using System; using System.Collections.Generic; using System.Compone ...