十二、相等操作符

如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等。

SequenceEqual方法通过并行地枚举两个数据源并比较相应元素来判断两个序列是否相等。如果两个序列完全相等,返回true,否则返回false。以下代码是SequenceEqual方法的实现过程:

public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
{
if (comparer == null)
{
comparer = EqualityComparer<TSource>.Default;
}
if (first == null)
{
throw Error.ArgumentNull("first");
}
if (second == null)
{
throw Error.ArgumentNull("second");
}
using (IEnumerator<TSource> enumerator = first.GetEnumerator())
{
using (IEnumerator<TSource> enumerator2 = second.GetEnumerator())
{
while (enumerator.MoveNext())
{
if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current))
{
return false;
}
}
if (enumerator2.MoveNext())
{
return false;
}
}
}
return true;
}

以上代码的执行过程为:

1.         如果比较器为null,赋值为默认值EqualityComparer<TSource>.Default。

2.         如果序列1为null,抛出异常。

3.         如果序列2为null,抛出异常。

4.         遍历序列1。在此过程中,如果序列2到达底端则返回false;如果序列1的当前值与序列2的当前值不同,则返回false。

5.         序列1遍历完成后,如果序列2未到达底端,则返回false。

6.         如果第2-5步都没有执行,则返回true。

十三、限定操作符

限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。

下图描述了两个不同源序列上的两个不同限定符运算。第一个运算询问是否有一个或多个元素为字符“A”,结果为 true。第二个运算询问是否所有元素都为字符“A”,结果为 true

1. All

All方法用来确定是否序列中的所有元素都满足条件。以下代码演示了All的用法:

string[] source1 = new string[] { "A", "B", "C", "D", "E", "F" };
string[] source2 = new string[] { "A", "A", "A", "A", "A", "A" };
Console.WriteLine(source1.All(w => w == "A")); //console will print "False"
Console.WriteLine(source2.All(w => w == "A")); //console will print "True"

2. Any

Any方法的无参方式用来确定序列是否包含任何元素。如果源序列包含元素,则为 true;否则为 false。

Any方法的有参方式用来确定序列中是否有元素满足条件。只要有一个元素符合指定条件即返回true,如果一个符合指定条件的元素都没有则返回false。以下代码演示了Any方法有参方式的用法:

string[] source1 = new string[] { "A", "B", "C", "D", "E", "F" };
string[] source2 = new string[] { "A", "A", "A", "A", "A", "A" };
Console.WriteLine(source1.Any(w => w == "A")); //console will print "True"
Console.WriteLine(source2.Any(w => w == "A")); //console will print "True"

3. Contains

Contains方法用来确定序列是否包含满足指定条件的元素。如果有返回true,否则返回false。以下代码使用默认的String比较器来判断序列中是否含有指定的字符串:

string[] source1 = new string[] { "A", "B", "C", "D", "E", "F" };
Console.WriteLine(source1.Contains("A")); //console will print "True"
Console.WriteLine(source1.Contains("G")); //console will print "False"

如果要对序列中的元素进行自定义比较,需要一个IEqualityComparer<T>接口的实现类作为比较器,用于比较序列中的元素。

十四、分区操作符

LINQ 中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分的操作。

下图显示对一个字符序列执行三个不同的分区操作的结果。第一个操作返回序列中的前三个元素。第二个操作跳过前三个元素,返回剩余的元素。第三个操作跳过序列中的前两个元素,返回接下来的三个元素。

1. Take

Take(int n)方法将从序列的开头返回数量为n的连续元素。以下代码演示了从一个序列中返回其前五个元素:

int[] source = new int[] { , , , , , , , , , , , ,  };
var q = source.Take();
foreach (var item in q)
{
Console.WriteLine(item);
}

上述代码的运行结果为下图所示:

            var query =
db.Employees
.Take()
.ToList(); 查询sql: SELECT TOP ()
[c].[EmployeeID] AS [EmployeeID],
[c].[LastName] AS [LastName],
[c].[FirstName] AS [FirstName],
[c].[Title] AS [Title],
[c].[TitleOfCourtesy] AS [TitleOfCourtesy],
[c].[BirthDate] AS [BirthDate],
[c].[HireDate] AS [HireDate],
[c].[Address] AS [Address],
[c].[City] AS [City],
[c].[Region] AS [Region],
[c].[PostalCode] AS [PostalCode],
[c].[Country] AS [Country],
[c].[HomePhone] AS [HomePhone],
[c].[Extension] AS [Extension],
[c].[Photo] AS [Photo],
[c].[Notes] AS [Notes],
[c].[ReportsTo] AS [ReportsTo],
[c].[PhotoPath] AS [PhotoPath]
FROM [dbo].[Employees] AS [c]

2. TakeWhile

TakeWhile方法执行时将逐个比较序列中的每个元素是否满足指定条件,直到碰到不符合指定的条件的元素时,返回前面所有的元素组成的序列。以下代码演示了这一过程:

int[] source = new int[] { , , , , , , , , , , , ,  };
var q = source.TakeWhile(i => i < );
foreach (var item in q)
{
Console.WriteLine(item);
}

上述代码的运行结果为下图所示:

3. Skip

Skip(int n)方法将跳过序列开头的n个元素,然后返回其余的连续元素。以下代码演示了从一个序列中跳过前五个元素,然后返回其余的元素组成的序列:

int[] source = new int[] { , , , , , , , , , , , ,  };
var q = source.Skip();
foreach (var item in q)
{
Console.WriteLine(item);
}

上述代码的运行结果为下图所示:

            var query =
db.Employees
.OrderBy(e => e.EmployeeID)
.Skip()
.ToList(); 查询sql: SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Title] AS [Title],
[Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[HireDate] AS [HireDate],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[Region] AS [Region],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[Country] AS [Country],
[Extent1].[HomePhone] AS [HomePhone],
[Extent1].[Extension] AS [Extension],
[Extent1].[Photo] AS [Photo],
[Extent1].[Notes] AS [Notes],
[Extent1].[ReportsTo] AS [ReportsTo],
[Extent1].[PhotoPath] AS [PhotoPath]
FROM ( SELECT [Extent1].[EmployeeID] AS [EmployeeID], [Extent1].[LastName] AS [LastName], [Extent1].[FirstName] AS [FirstName], [Extent1].[Title] AS [Title], [Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy], [Extent1].[BirthDate] AS [BirthDate], [Extent1].[HireDate] AS [HireDate], [Extent1].[Address] AS [Address], [Extent1].[City] AS [City], [Extent1].[Region] AS [Region], [Extent1].[PostalCode] AS [PostalCode], [Extent1].[Country] AS [Country], [Extent1].[HomePhone] AS [HomePhone], [Extent1].[Extension] AS [Extension], [Extent1].[Photo] AS [Photo], [Extent1].[Notes] AS [Notes], [Extent1].[ReportsTo] AS [ReportsTo], [Extent1].[PhotoPath] AS [PhotoPath], row_number() OVER (ORDER BY [Extent1].[EmployeeID] ASC) AS [row_number]
FROM [dbo].[Employees] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] >
ORDER BY [Extent1].[EmployeeID] ASC

4. SkipWhile

SkipWhile方法执行时将逐个比较序列中的每个元素是否满足指定条件,直到碰到不符合指定的条件的元素时,返回其余所有的元素组成的序列。以下代码演示了这一过程:

int[] source = new int[] { , , , , , , , , , , , ,  };
var q = source.SkipWhile(i => i < );
foreach (var item in q)
{
Console.WriteLine(item);
}

上述代码的运行结果为下图所示:

LINQ标准查询操作符(五)的更多相关文章

  1. Linq 标准查询操作符三

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  2. LINQ 标准查询操作符

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  3. LINQ标准查询操作符详解(转)

     一. 关于LINQ       LINQ 英文全称是“Language-Integrated Query”,中文为“语言集成查询”,它是微软首席架构师.Delphi 之父和C# 之父——Anders ...

  4. LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

    七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...

  5. 【LINQ标准查询操作符总结】之聚合操符

    C#  中的LINQ 提供了两种操作方式,查询表达式和查询操作符,所有的查询表达式都有对应的查操作符类替代,查询表达式有点“类” SQL,在代码中写SQL,总觉得不够“优雅”,使用查询操作符就显得“优 ...

  6. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

  7. LINQ标准查询操作符(二)——Join、GroupJoin、GroupBy、Concat、

    四.联接操作符 联接是指将一个数据源对象与另一个数据源对象进行关联或者联合的操作.这两个数据源对象通过一个共同的值或者属性进行关联. LINQ有两个联接操作符:Join和GroupJoin. 1. J ...

  8. LINQ标准查询操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: //查询语法 var query = fro ...

  9. Linq标准查询操作符

     Linq的出现让代码简洁了不少.之前在项目中基本都在使用它,但是没有完整的整理过,今天借这个周末,将其进行整理,方便后期对其的使用.Linq的操作可以分为聚合,连接,转换,元素操作符,相等操作,生成 ...

随机推荐

  1. Hosting Your Own NuGet Feeds

    Hosting Your Own NuGet Feeds Hosting the NuGet Gallery Locally in IIS https://github.com/NuGet/NuGet ...

  2. Winform——计算器进制转换

    namespace 进制转换2._0 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } p ...

  3. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  4. UVa 11624 (BFS) Fire!

    也是一个走迷宫的问题,不过又有了点变化. 这里迷宫里有若干把火,而且火每秒也是向四个方向蔓延的.问人是否能走出迷宫. 我用了两遍BFS,第一遍把所有着火的格子加入队列,然后计算每个格子着火的时间. 第 ...

  5. ubuntu搭建DNS

    ubuntu搭建DNS 一.     bind简介: BIND是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,主要包括以下三种: *域名服务器 *D ...

  6. codeigniter框架扩展核心类---实现前台后台视图的分离

    1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/  constants.php中增加 /*m ...

  7. scala学习笔记(9):Scala函数(2)

    1 指令式编程&函数式编程 指令式:imperative 风格编程.指令式风格,是你常常使用像 Java,C++和 C 这些语言里用的风格,一次性发出一个指令式的命令,用循环去枚举,并经常改变 ...

  8. 定时组件quartz系列<二>quartz的集群原理

    1.基本信息:      Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或 ...

  9. 【转】Ubuntu搭建Eclipse+JDK+SDK的Android

    原文网址:http://blog.csdn.net/ithomer/article/details/6960989 今晚重装Ubuntu系统,重新安装了一套eclipse+jdk+SDK的Androi ...

  10. Android 自定义view中的属性,命名空间,以及tools标签

    昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的 ...