概述

  事实上,对于LINQ to Objects来说,就是通过为IEnumerable<T>接口定义了一组约50个扩展方式来实现的。

Lambda表达式(拉姆达表达式,Lambda Expression)

  匿名方法是在C#2.0中引入的。在C#3.0中,又引入了一种Lambda表达式的语法,可以将它视为匿名方法的等价物,但是语法更为简洁,使得匿名方法的编写变得更加方便。

  对于一些扩展方法,它的返回值也是IEnumerable<T>类型,这意味着可以进行一种链式的方法调用,例如list.Where().Orderby().Select().ToList()。 每调用一次,就对列表进行了一次加工。

  C#专门为LINQ提供了一种称做查询表达式(Query Expression)的语法,该语法编译后就相当于调用上小节提到的扩展方法。 一个简单的查询表达式如下:

//获得集合,本章将会多次出现
static ProductCollection col = Product.GetSampleCollection();
static void Main(string[] args)
{
var query = from x in col
where x.Category == "Beer"
orderby x.Code
select new { Title = x.Name.ToUpper(), Code = x.Code };
foreach (var item in query)
{
Console.WriteLine("{0}, {1}", item.Code, item.Title);
}
}

  在这个查询表达式中,from声明了一个范围变量(range variable)x;in关键字后面是要查询的数据源col;where后面是筛选的依据,为Lambda表达式;最后select投影操作创建了一个新的匿名类型。

与这个查询表达式相对应的链式方法调用是这样:

var query = col
       .Where(x => x.Category == "Beer")
       .OrderBy(x => x.Code)
       .Select(x => new { Title = x.Name.ToUpper(), Code = x.Code });

  查询表达式和方法调用可以混合使用,因此,上面的语句也可以这样写:

var query = from x in col.where(x => x.Category == "Beer")
       orderby x.Code
       select new { Title = x.Name.ToUpper(), Code = x.Code };

一般来说,有这样两种策略:

  1)只使用链式方法调用。 但在个别情况下,比如两个集合的连接操作中,使用链式方法调用会使语句变得很复杂,此时应混合使用查询表达式。

  2)只使用查询表达式。 但对于某些查询表达式不支持的操作,例如Concat(),混合使用方法调用。

笔者采用的是是第一种策略,因为方法调用更为基础,查询表达式能实现的功能,方法调用全都能实现,而且在大多数情况下使用起来并没有太多不便之处。

-----

1.Where()

2.OfType()
OfType()方法也用于筛选。 与其他运算符不同的是,OfType()定义在IEnumerable上,而不是IEnumerable<T>,它的作用是从非泛型集合中筛选出某一类型的成员并返IEnumerable<T>。

因为OfType()返回的是IEnumerable<T>,所以返回的结果可以继续调用其他的LINQ运算符。

 ArrayList list = new ArrayList();
list.Add();
list.Add(DateTime.Now);
list.Add("Have fun");
list.Add("Intresting");
var query = list.OfType<string>().Where(x => x.StartsWidth("Have"));//输出:Have fun

3.Cast()
与OfType()类似,Cast()也定义在IEnumerable上,它用于将非泛型的序列转换为泛型序列IEnumerable<T>。 当某一序列项无法成功转换时,则会抛出异常:

ArrayList list = new ArrayList();
list.Add();
list.Add("Have fun");
var query = list.Cast<int>(); //异常: System.InvalidCastException: 指定的转换无效

4.OrderBy()--OrderByDescending()

var query = col.OrderBy(x => x.Category);

ThenBy()--ThenByDescending()

var query = col.OrderBy(x => x.Category).ThenBy(x => x.Price);

5.Select()

Select()运算符在上面也出现过,它实现了一种投影操作,可以进行对象类型转换。

var query = col.Select((x, index) => new { Title = x.Name, Index = index, Price = x.Price

6.Take()和Skip()

Take()运算符返回了由原序列中前N个元素构成的新序列,N由参数指定。

var query = col.Take(); // 返回前3个元素

Skip()运算符和Take()正好相反,它跳过N个元素,返回后面的所有元素构成的序列:

var query = col.Skip(); // 返回第3个元素之后的所有元素

Skip()和Take()结合起来也可以进行分页,例如,每页显示20条数据,显示第2页的数据,可以这样编写代码:

var query = col.Skip().Take();

7.TakeWhile()和SkipWhile()

TakeWhile()和Where()有点类似,只不过当Where()遇到不符合条件的元素时,会继续查找序列中满足条件的下一个元素,直到序列结束。

而TakeWhile()在遇到不符合条件的元素时会直接返回前面找到的满足条件的元素。

int[] array = { , , , , };
var query = array.TakeWhile(x => x <= ); // 输出1,2

SkipWhile()是TakeWhile()的反操作,它会一直跳过符合条件的元素,直到遇到第一个不符合条件的元素,然后返回该元素之后的所有元素构成的序列。

int[] array = { , , , , };
var query = array.SkipWhile(x => x <= ); // 输出10,4,5
query.ShowConsole();

8.Reverse()

Reverse()用于将序列中的元素逆序排列,例如:

int[] array = { , , };
var query = array.Reverse(); // 输出3,2,1

9.DefaultIfEmpty()

当序列为空时,DefaultIfEmpty()为序列添加一个元素,使用元素的默认值,或者指定元素的值,例如:

int[] array = { };
var query = array.DefaultIfEmpty(); // 输出0
var query2 = array.DefaultIfEmpty(); // 输出100

注意到int是结构类型(值类型),它的默认值为0。 当为类类型时,默认值为null,此时如果不指定默认值则会抛出异常:未将对象引用设置到对象的实例。

ProductCollection col3 = new ProductCollection();
var query = col3.DefaultIfEmpty(); // null
query.ShowConsole();

10.Distinct()
如其名称所表示的,Distinct()运算符用于剔除序列中的重复元素,并返回其余的所有元素。

int[] array = { , , ,  };
var query = array.Distinct(); // 得到 1,2,3

11.GroupBy() 

在LINQ中,GroupBy()的结果可以是一个树形结构,即序列中的元素也是一个序列。

var query = col.GroupBy(x => x.Category);
foreach (var item in query)
{
Console.WriteLine("<{0}>", item.Key);
foreach (var p in item)
{
Console.WriteLine(p.ToString());
}
}

12.Intersect()Except()

资料

https://www.cnblogs.com/knowledgesea/p/3897665.html

LINQ 查询的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  2. LinqToDB 源码分析——轻谈Linq查询

    LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...

  3. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...

  4. C#基础:LINQ 查询函数整理

    1.LINQ 函数   1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...

  6. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  7. c# Linq查询

    c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合 ...

  8. Linq查询表达式

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  9. .NET LINQ查询操作中的类型关系

    LINQ 查询操作中的类型关系      若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. 另外 ...

  10. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

随机推荐

  1. jenkins pipeline 部署

    一.git 版本控制结合jenkins 发布 sh-4.2$ git branch sh-4.2$ git chekout master sh-4.2$ git tag v1.1 sh-4.2$ gi ...

  2. 对html第一次尝试

    1.对于写文档                         修改后缀为html,双击进入为网页模式. 2.编写网页 1)新建 2)基本格式 <!DOCTYPE html><!-- ...

  3. Unity Dotween官方案例学习

    本文只涉及一些案例,具体查看 DoTween 官方文档. 一. Basics public class Basics : MonoBehaviour { public Transform redCub ...

  4. DRF02

    1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...

  5. WebShell代码分析溯源(第1题)墨者学院

    一.访问链接 二.下载系统源码后直接放到D盾里扫描,扫到后门文件 三.查看该木马文件 <?php error_reporting(0); $_GET['POST']($_POST['GET']) ...

  6. ace -- 语法高亮

    Creating a Syntax Highlighter for Ace 给ace创建一个语法高亮 Creating a new syntax highlighter for Ace is extr ...

  7. 2-Sixteenth Scrum Meeting-20151216

    任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码  编写与服务器交互的代码 史烨轩 获取视频url   余帆  本地 ...

  8. 剑指offer:数值的整数次方

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解题思路: 一开始直接用一个for循环做连乘,测了一下,发现这个指数可能是负 ...

  9. 第二个Sprint计划

    第一个Sprint计划已完成基本框架,接着第二个计划 时间:5月30-6月3日 目标:能够将各个框架连接起来,实现基本功能,并查看数据库连接. 分工:杜殷浩:查看数据库连接,创建数据库. 何广强:实现 ...

  10. 在eclipse中编译调试ns3

    1首先把ns3项目导入eclipse 然后把上面的的ns3按照上面的提示即可导入成功.   然后可以运行一下 ./waf configure     2 配置C/C++ Build 右键工程,选择属性 ...