我的编程空间,编程开发者的网络收藏夹
学习永远不晚

LINQ中的关键字怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

LINQ中的关键字怎么使用

这篇文章主要讲解了“LINQ中的关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ中的关键字怎么使用”吧!

什么是LINQ

LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。

LINQ包括LINQ to Objects,LINQ to SQL ,LINQ to XML ,LINQ to DataSet等,本篇从LINQ to Objects开始了解LINQ的皮毛。

开始LINQ前你要知道的

扩展方法

顾名思义就是对现有类进行扩展的的方法,扩展方法可以在不修改现有类的情况下,为现有类增加公共的接口(不是C#中的interface)。

扩展方法本质上是一个静态方法,不同之处在于它的***个参数必须有this关键字声明,并且***个参数的类型即为要扩展的类型。如

public static double ToDouble(this string source)  {      double res = 0d;      double.TryParse(source, out res);      return res;  }   public static void SimpleExtesionMethod()  {      double d = "12345.54321".ToDouble();      Console.WriteLine(d);  }

这里是个简单的将字符串转为double类型的扩展方法,只要引用了该方法的命名空间,则都可以直接用string类型来调用ToDouble方法。

扩展方法是后文的基础,C#3.0中的LINQ的实现都是基于扩展方法,通过对IEnumerable<T>接口(LINQ to Objects)的扩展和对IQueryable<T>的扩展来实现LINQ的相关功能,而LINQ的相关关键字最终都是转化为对IEnumerable<T>(IQueryable<T>)的调用。

Lambda表达式

lambda表达式其实就是就是.net2.0中的匿名方法,然后再3.0中以一种更优美的姿态呈现出来。

lambda表达式的基本语法为

(参数列表) =>{语句块;}    或者

( 参数列表) =>表达式

当参数列表中只有一个参数的时候,圆括号可以省略

Func<string, string> func = x => x + x;  Console.WriteLine(func("a"));

Var:隐式类型化变量

使用与可以由编译器推导出的变量的声明,不需要显式指定对象的类型。

var container = new List<string> { "张三", "李四", "王五" };  IEnumerable<string> query = from name in container              select name;

上例中由于定义中已经指明了对象的类型,声明中已经完全没有必要使用显示的类型定义,所以可以使用var关键字。

对于匿名对象

var test = new { Name = "Sth.", Type = "UnKnown" };

由于无法用一个类型类声明匿名对象,此时可以用var是声明。

注意var只是省下了显式声明的过程,而C#本身就是静态语言,所以var所声明的变量的类型已经确定任然是不能改变的,亦即,var并非是变体类型。

LINQ对谁适用

LINQ的语法通过System.LINQ下面的Enumerable类提供支持,通过观察他的签名,你就会发现他为IEnumerable<T>实现了一系列的扩展方法,也就是说,只要是实现了IEnumerable<T>的对象都可以使用LINQ的语法来查询。

而对于只实现了IEnumerable接口而没有实现IEnumerable<T>的对象可以通过

public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source);

来将IEnumerable接口转为IEnumerable<T>(例如ArrayList)。

LINQ中的关键字

在C#3.0中,为LINQ引入了一些新的关键字,他们是:

from join where group into let orderby select

熟悉Sql的同学看着是不是有些眼熟呢,其实在LINQ中他们的涵义和在SQL中类似的,所以会很容易理解的。接下来的时间,简单介绍下这些关键字的使用。

from

from子句是一个LINQ查询的开始,任何一个LINQ语句都是以from开始,from子句指定查询的容器,和在此语句有效的局部变量(用来指定容器中的一项,from子句的效果很类似于foreach)。from子句的语法为

from local in containerlocal

就是在此LINQ语句中的局部变量,由于container必须为IEnumerable<T>,他的类型可以由container推导出来(即T)。上一段简单的例子:

var container = new List<string> { "张三", "李四", "王五" };  var query = from name in container              select name;   foreach (string name in query)  {      Console.WriteLine(name);  }

输出

张三
李四
王五

如果container仅仅实现IEnumerable而没有实现IEnumerable<T>,则需要显式指定局部变量的类型,或者是使用Cast转为IEnumerable<T>

var container = new ArrayList { "张三", "李四", "王五" };  var query = from name in container.Cast<string>()              select name;//或者  var query1 = from string name in container               select name;select

对查询的结果进行投影,在子句中指定要选择的列,如上例

有的时候,我们只需要投影某一列,我们可以这样

private static void TestSelectSingleProperty()  {      var persons = GetPersons();       var query = from p in persons                  select p.Name;       foreach (var item in query)      {          Console.WriteLine(item);      }  }

我们还可以指定要投影的列的集合,这个时候我们要用到匿名类型

var query = from p in persons              select new { p.ID, p.Name };   foreach (var item in query)  {      Console.WriteLine("No:{0},Name:{1}",item.ID,item.Name);  }

query中的每一项都时候一个拥有ID属性和Name属性的对象,当然有的时候实体的属性名不是我们想要的,或者是通过对属性计算得来的,那么我们可以显式指定属性名,就像下面这样:

var query = from p in persons              select new             {                  UserID = p.ID,                  FriendName = p.Gender == "男" ? "Mr" : "Ms" + p.Name              };   foreach (var item in query)  {      Console.WriteLine("No:{0},Friendly Name:{1}", item.UserID, item.FriendName);  }

where

对容器内的数据进行筛选。

var query = from p in persons              where p.DepartmentID == 1              select p.Name;join

类似SQL里的join,LINQ中的join子句用于将两个容器的数据以某种关系进行关联。

var departments = GetDepartments();  var persons = GetPersons();   var query = from d in departments              join p in persons on d.ID equals p.DepartmentID              select new { d, p };

值得注意的是join子句只能使用equals或者是not equal而不能用其他运算符(==都不行)。而equals运算符左边必须联接的左部,右边为右部,不能调换的,否则编译不能通过。

into

into子句用于将join或者是group子句的结果进一步持续化,包装成为一个

System.LINQ.IGrouping<TKey, TElement>

对象,而且IGrouping继承自IEnumerable<TElement>,可以看出,IGrouping接口提供分组的键和,该键下所包含的集合。例子见group

group

对结果按照指定的条件进行分组

var container = new List<string> { "ZhangSan", "LiSi", "Wangwu", "ZhaoLiu", "Deng" };  var query = from name in container              group name by name.Length into g              select new { g.Key, Values = g };

例子演示了通过姓名的长度对一个姓名列表进行分组,并将分组的结果保持到局部变量g中,可以通过下面的代码将query的结果输出

foreach (var group in query)  {      Console.WriteLine("{0}:", group.Key);      foreach (var item in group.Values)      {          Console.WriteLine(item);      }  }

let

let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见

var query = from p in persons              let friendlyName = p.Gender == "男" ? "Mr" : "Ms" + p.Name              select new             {                  UserID = p.ID,                  FriendName = friendlyName              };   foreach (var item in query)  {      Console.WriteLine("No:{0},Friendly Name:{1}", item.UserID, item.FriendName);  }

在IEnumerable<T>上的其他扩展

Take Skip

用于选取前XX个或者和跳过前XX个,如选择第11到20个则可以

query.Skip(10).Take(10);OrderBy OrderByDescending

排序而已

query.OrderBy(c => c.Length);Distinct Union Intersect Except 这些单词都见过吧,分别就是取不重复,并集,交集,差集(这个貌似看看参数就明白了)

。。。。其他扩展都在Enumerable类下面了。

LINQ的延迟加载特性

LINQ查询的执行结果是IEnumerable<T>类型,而对IEnumerable<T>,在内部,C#通过yield关键字实现迭代器达到延迟加载的目的。从而使LINQ查询只是在需要的时候才会被执行。

但是,某一些扩展方法在执行时会试图遍历整个容器,从而使延迟加载无效,如排序,聚合函数(Count,Sum,Average等。)

static IEnumerable<int> InfinityInts()  {      int count = 0;      while (true)          yield return count++;  }   public static void LazyLoad()  {      var query = from i in InfinityInts()                  select i;      foreach (var i in query.Take(20))      {          Console.WriteLine(i);      }  }   public static void CantDoLazyLoad()  {      var query = from i in InfinityInts()                  select i;      foreach (var i in query.OrderBy(i => i).Take(20))      {          Console.WriteLine(i);      }  }

这里有个简单的例子来证明,当使用Take时候,LINQ语句能正常的执行,而当我们再LINQ上使用一个Order By之后,程序就卡死了,当然,这是理所应当的,在失去延迟加载的特性之后,试图对一个无穷序列排序的结果一定是outOfMemory。

感谢各位的阅读,以上就是“LINQ中的关键字怎么使用”的内容了,经过本文的学习后,相信大家对LINQ中的关键字怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

LINQ中的关键字怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

LINQ中的关键字怎么使用

这篇文章主要讲解了“LINQ中的关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ中的关键字怎么使用”吧!什么是LINQLINQ是Language Integrated Q
2023-06-17

Linq 中LET关键字的作用是什么

今天就跟大家聊聊有关Linq 中LET关键字的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。LINQ是Language Integrated Query (语言集成查询)。
2023-06-17

typeScript中的extends关键字怎么使用

本篇内容主要讲解“typeScript中的extends关键字怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“typeScript中的extends关键字怎么使用”吧!extends 是
2023-07-05

java中的volatile关键字怎么使用

本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.volatile实现可见性的原理
2023-06-25

java中的final关键字怎么使用

在Java中,final关键字可以用于修饰类、方法和变量。1. final修饰类:final修饰的类是不可被继承的,即该类不能有子类。例如:```javafinal class MyClass {// 类的内容}```2. final修饰方
2023-08-24

java中的super关键字怎么使用

在Java中,super是一个关键字,用于引用父类的成员变量、成员方法和构造方法。1. 引用父类的成员变量:可以使用super关键字来引用父类中的成员变量。例如,如果父类中有一个成员变量名为num,可以使用super.num来引用父类中的n
2023-08-08

Golang中的defer关键字怎么使用

在Golang中,defer关键字用于注册一个函数调用,该函数会在当前函数执行完成后被执行,无论函数是正常返回还是发生了panic。defer语句通常用于在函数执行结束后释放资源或执行一些清理操作。defer关键字的语法如下:func
Golang中的defer关键字怎么使用
2024-03-13

Java中transient关键字怎么使用

本篇内容主要讲解“Java中transient关键字怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中transient关键字怎么使用”吧!一、概要介绍 对于transient
2023-07-06

C++中register关键字怎么使用

本篇内容介绍了“C++中register关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!register 简介:register
2023-07-05

java中this关键字怎么使用

这篇文章主要介绍了java中this关键字怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中this关键字怎么使用文章都会有所收获,下面我们一起来看看吧。this 的使用:修饰属性和方法,也可以理
2023-06-26

Java中 transient关键字怎么使用

本篇文章为大家展示了Java中 transient关键字怎么使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizabl
2023-06-19

java中abstract关键字怎么使用

在Java中,abstract关键字主要用于定义抽象类和抽象方法。1. 抽象类的定义:使用abstract关键字修饰类,将其声明为抽象类。抽象类不能被实例化,只能被继承。抽象类可以包含普通方法和抽象方法。示例代码:```javaabstra
2023-09-23

Java中super关键字怎么使用

这篇文章主要讲解了“Java中super关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中super关键字怎么使用”吧!supersuper是一个关键字,全部小写。sup
2023-07-02

C++中auto关键字怎么使用

今天小编给大家分享一下C++中auto关键字怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提引入1.类型名,在绝大
2023-07-06

Objective-C中的@Synchronized关键字怎么使用

这篇文章主要介绍“Objective-C中的@Synchronized关键字怎么使用”,在日常操作中,相信很多人在Objective-C中的@Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-07-05

Python中nonlocal关键字与global关键字怎么用

小编给大家分享一下Python中nonlocal关键字与global关键字怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python引用变量的顺序: 当前作
2023-06-29

SQL的Merge关键字怎么使用

这篇文章主要介绍“SQL的Merge关键字怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL的Merge关键字怎么使用”文章能帮助大家解决问题。Merge关键字是一个神奇的DML关键字。它
2023-06-27

persistent关键字怎么在Android中使用

本篇文章为大家展示了persistent关键字怎么在Android中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android关键字persistent原理分析在Android程序开发时我们会
2023-06-14

Java的abstract关键字怎么使用

在Java中,abstract关键字可以用于以下三个地方:1. 抽象类:使用abstract关键字来声明一个抽象类。抽象类是不能被实例化的,只能被继承。抽象类可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,子类必须实现抽象方法才能使
2023-09-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录