背景

传统上,针对数据的查询都以简单的字符串表示,而没有编译时类型检查或 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 % 2 == 0))
{
    str.Append(item);
}

老式IF用法:

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

Take


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

例子:

var list = Enumerable.Range(1, 100000);
foreach (int item in list.Take(10))
{
   Console.WriteLine(item.ToString());
}

Select


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

例子:

var list = new List<Animal> {
  new Animal{ Name="hot dog",Sex=1,Age=10},
  new Animal{ Name="big dog",Sex=0,Age=11},
  new Animal{ Name="bin dog",Sex=0,Age=12},
  new Animal{ Name="baby dog",Sex=1,Age=13},
};

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 * 2, 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 * 2))
{
  Console.WriteLine(item.ToString());
}

结果:

SelectMany


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

例子:

var parameters = new Parameter[]
{
  new Parameter() { Name = "正一", Numbers = new int[] { 1, 2, 3 } },
  new Parameter() { Name = "清次", Numbers = new int[] { 1, 3, 5 } },
  new Parameter() { Name = "誠三", Numbers = new int[] { 2, 4, 6 } },
  new Parameter() { Name = "征史", Numbers = new int[] { 9, 8, 7 } },
};

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[] { 1, 2, 3 } },
  new Parameter() { Name = "清次", Numbers = new int[] { 1, 3, 5 } },
  new Parameter() { Name = "誠三", Numbers = new int[] { 2, 4, 6 } },
  new Parameter() { Name = "征史", Numbers = new int[] { 9, 8, 7 } },
};
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[] { 0, 1, 3, 3, 2 };
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[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var list = new List<Animal> {
  new Animal{ Name="hot dog",Sex=1},
  new Animal{ Name=null,Sex=0},
  new Animal{ Name="bin dog",Sex=0},
  new Animal{ Name="baby dog",Sex=1},
};

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 = 0 },
  new PersonData() { Name = "清次郎", ItemID = 1 },
  new PersonData() { Name = "誠三郎", ItemID = 2 },
  new PersonData() { Name = "征史郎", ItemID = 0 },
};

ItemData[] items = new ItemData[]
{
  new ItemData() { ID = 0, Name = "金" },
  new ItemData() { ID = 1, 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[] { 1, 2, 3, 4, 5 };
int[] numbersB = new int[] { 8, 6, 4, 2, 0 };

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 = 0, Name = "正一郎" },
       new Parameter() { ID = 5, Name = "清次郎" },
       new Parameter() { ID = 3, Name = "誠三郎" },
       new Parameter() { ID = 9, Name = "征史郎" },
   };
   Parameter[] dataB = new Parameter[]
  {
     new Parameter() { ID = 5, Name = "清次郎" },
     new Parameter() { ID = 3, Name = "誠三郎" },
     new Parameter() { ID = 2, 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(1, 5);
IEnumerable<int> intSequenceB = Enumerable.Range(-1, 3);
IEnumerable<int> intSequenceC = Enumerable.Range(100, 4);

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/C++中static关键字用法汇总

    1. 函数内static局部变量:变量在程序初始化时被分配,直到程序退出前才被释放,也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期.多次调用,仅需一次初始化. 2. ...

  2. java+中的final关键字有哪些用法_Java中的Final关键字用法汇总及简单示例

    可能使用到final的情况有3种:数据.方法和类. 一.final数据 对于基本类型,final使数值恒定不变:而对于对象引用,final使引用恒定不变.一旦引用被初始化指向一个对象,就无法把它改为指 ...

  3. mysql常见关键字的用法_MySQL 常用关键字用法详解

    MySQL 常用关键字用法详解 在开发工程中,操作数据库的时候经常会有不同类型的条件查询,除了使用where外,Mysql本身也提供了很多常用的关键字.本文主要介绍一些常用的关键字,像update.i ...

  4. Linux 运维人最常用 150 个命令汇总

    Linux 运维人最常用 150 个命令汇总 命令 功能说明 线上查询及帮助命令 (2 个) man 查看命令帮助,命令的词典,更复杂的还有 info,但不常用. help 查看 Linux 内置命令 ...

  5. Linux常用到的指令汇总

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

  6. 技巧篇:常用的R代码汇总

    技巧篇:常用的R代码汇总 模块1:Xpath的一些练习 #install.packages("rvest") #install.packages("xlsx") ...

  7. Matlab——常用函数的用法总结(部分直接摘自mathwork,持续更新)

    Matlab--常用函数的用法总结(部分直接摘自mathwork,持续更新) 文章目录 Matlab--常用函数的用法总结(部分直接摘自mathwork,持续更新) 一.绘图篇 1.图像显示形式 ①f ...

  8. MySQL中的关键字用法(二)

    MySQL中的关键字的用法(二) limit:偏移量和数量 注意limit和offset的区别,下面有写到offset,注意区分: 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时 ...

  9. 一步一步学java(7):jar包使用方法及常用jar包分类汇总(持续更新)

    java最大的特点和优势就是纯面向对象.开源,除了JDK.JRE自带的基础类库之外,还有非常多的大牛们开发了各种应用的类库(jar包),本篇主要介绍一下这些类库的使用方法,并把常用jar包分类汇总,以 ...

最新文章

  1. 约束,索引,rownumrownum
  2. sublime Text3安装和verilog安装
  3. keras 与tensorflow绑定在一起用的,何以见得
  4. 串口基础类库(WIN32)异步通信 _COM_H 源代码
  5. JavaScript实现浏览器菜单的一些功能
  6. linux+geth+不能同步公链数据,以太坊(ETH)同步公链数据
  7. python最小二乘法拟合_Python 普通最小二乘法(OLS)进行多项式拟合
  8. html原生音频播放器倍速,HTML5倍数功能视频播放器(加速2倍,1.5倍播放)
  9. 结巴分词关键词相似度_gensim和jieba分词进行主题分析,文本相似度
  10. Memcached入门指南
  11. Spring的基本使用
  12. spring:我是如何解决循环依赖的?
  13. linux-tar命令
  14. webpack随笔06-bulma
  15. 高德地图的自动定位功能
  16. mining.subscribe与initiate_stratum函数
  17. esp8266,esp32中的SPI FLASH 访问模式(QIO QOUT DIO DOUT)
  18. 江苏计算机学业水平测试多少分过关,江苏学业水平测试的相关问题整理
  19. 网易魔兽怀旧服服务器型号,《魔兽世界》经典怀旧服服务器大盘点
  20. Linux中用VI/VIM编辑器

热门文章

  1. 错误 LINK : fatal error LNK1158: 无法运行“rc.exe”
  2. 当当创始人李国庆谈吴秀波事件:呼吁释放陈昱霖 应核查税收
  3. Cordova学习--iOS自定义插件
  4. iptables之xtables_addons浅度解析
  5. Log4Net 最简配置
  6. 勾股定理·圓周率·無窮級數·微積分
  7. [改善Java代码]让工具类不可实例化
  8. Android经常使用的五种弹出对话框
  9. 参数--argumengs
  10. mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释