背景

传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 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. wav文件系列_2_Python实现读写

    本文介绍了 Python 实现音频读写的方法.Python wave 模块提供便捷的 wav 文件操作.该模块并不支持压缩与解压,但支持单声道/立体声的转换. 参考: [1] wave — Read ...

  2. Python_文件处理

    1.Python  文件处理 打开文件---->读取内容---->获得内容 读取文件方式:  r  只读文件  w 只写模式 a 追加模式 r+b 读写模式   w+b 写读模式  a+b ...

  3. pycharm介绍

      PyCharm是一种Python IDE(集成开发软件),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具. 1.1 PyCharm主界面 PyCharm包含4个主要区分,分别为 ...

  4. Flask 上下文管理

    为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...

  5. mac系统访问windows共享文件夹

    1. 打开finder 2. 找到前往 - 连接服务器 3. 打开后,输入smb://ip地址  点击连接 4. 选择共享文件夹 5. 点击好,之后就可以了,如下图

  6. snprintf笔记

    在weibo上看到Laruence大神修复了一个使用snprintf的bug (http://t.cn/Rm6AuFh) 引起了TK教主的关注.TK教主着重提到了在windows下snprintf与_ ...

  7. Blob与Clob转字符串

    /** * blob转字符串 * * @param blob * @return * @throws IOException * @throws SQLException */ public stat ...

  8. Codeforces1100F. Ivan and Burgers(离线+线性基)

    题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...

  9. ssh 端口更改或ssh 远程接不上的问题(尤其是国外服务器)

    问题: Connecting to 149.*.*.*:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]' ...

  10. 【译著】Code First :使用Entity. Framework编程(5)

    第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...