
LINQ
C#,LINQ查询
singhwong
C#,UWP,.Net
展开
-
LINQ提供程序
.NET包含几个LINQ提供程序。LINQ提供程序为特定的数据源实现了标准的查询操作符。LINQ提供程序也许会实现比LINQ定义的更多的扩展方法,但至少要实现标准操作符。LIINQ to XML实现了一些专门用于XML的方法,例如,System.Xml.Linq名称空间中的Extensions类定义的Elements()、Descendants()和Ancestors()方法。LINQ提供程序...原创 2019-12-31 17:44:51 · 192 阅读 · 0 评论 -
LINQ(表达式树)
在LINQ to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。lambda表达式也可以赋予Expression<T>类型的参数。C#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression<T>,编辑器就从lambda表达式中创建一个表达式树,并存储在程序集中。这样,就可以在运行期间分析表达式树,并进...原创 2019-12-31 00:46:27 · 599 阅读 · 0 评论 -
并行LINQ
并行查询System.Linq名称空间中包含的类ParallelEnuerable可以分解查询的工作,使其分布在多个线程上。尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallelQuery<TSource>类的扩展。一个重要的例外是AsParallel()方法,它扩展了IE...原创 2019-12-29 16:43:46 · 256 阅读 · 0 评论 -
LINQ(生成操作符)
生成操作符Range()、Empty()和Repeat()不是扩展方法,而是返回序列的正常静态方法。在LINQ to Objects中,这些方法可用于Enumerable类。有时需要填充一个范围的数字,此时就应该使用Range()方法。这个方法把第一个参数作为起始值,把第二个参数作为要填充的项数: static void GenerateRange() {...原创 2019-12-27 18:23:20 · 202 阅读 · 0 评论 -
LINQ(转换操作符)
前面提到,查询可以推迟到访问数据项时再执行。在迭代使用查询时,查询会执行。而使用转换操作符会立即执行查询,把查询结果放在数组、列表或字典中。在下面的例子中,调用ToList()扩展方法,立即执行查询,得到的结果放在List<T>类中: static void ToList() { List<Racer> rac...原创 2019-12-27 18:05:37 · 207 阅读 · 0 评论 -
LINQ(聚合操作符)
聚合操作符(如Count、Sum、Min、Max、Average和Aggregate操作符)不返回一个序列,而返回一个值。Count()扩展方法返回集合中的项数。下面的Count()方法应用于Racer的Years属性,来筛选赛车手,只返回获得冠军次数超过3次的赛车手。因为同一个查询中需要使用同一个计数超过一次,所以使用let子句定义了一个变量numberYears: st...原创 2019-12-26 18:04:20 · 362 阅读 · 0 评论 -
LINQ(分区)
扩展方法Take()和Skip()等的分区操作可用于分页,例如,在第一个页面上只显示5个赛车手,在下一个页面上显示接下来的5个赛车手等。在下面的LINQ查询中,把扩展方法Skip()和Take()添加到查询的最后。Skip()方法先忽略根据页面大小和实际页数计算出的项数,再使用Take()方法根据页面大小提取一定数量的项: static void Partitioning(...原创 2019-12-26 15:55:33 · 153 阅读 · 0 评论 -
LINQ(合并)
Zip()方法允许用一个谓词函数把两个相关的序列合并为一个。首先,创建两个相关的序列,它们使用相同的筛选(国家意大利)和排序方法。对于合并,这很重要,因为第一个集合中的第一项会与第二个集合中的第一项合并,第一个集合中的第二项会与第二个集合中的第二项合并,以此类推。如果两个序列的项数不同,Zip()方法就在到达较小集合的末尾时停止。第一个集合中的元素有一个Name属性,第二个集合中的元素有L...原创 2019-12-26 15:00:30 · 1200 阅读 · 0 评论 -
LINQ(集合操作)
扩展方法Distinct()、Union()、Intersect()和Except()都是集合操作。下面创建一个驾驶法拉利的一级方程式冠军序列和驾驶迈凯轮的一级方程式冠军序列,然后确定是否有驾驶法拉利和迈凯轮的冠军。当然,这里可以使用Inersect()扩展方法。首先获得所有驾驶法拉利的冠军。这只是一个简单的LINQ查询,其中使用复合的from子句访问Cars属性,该属性返回一个字符串对象序列...原创 2019-12-26 14:17:12 · 367 阅读 · 0 评论 -
LINQ(组连接)
左外连接使用了组连接和into子句。它有一部分语法与组连接相同,只不过组连接不使用DefaultIfEmpty方法。使用组连接时,可以连接两个独立的序列,对于其中一个序列中的某个元素,另一个序列中存在对应的一个项列表。下面的示例使用了两个独立的序列。一个是前面例子中已经看过的冠军列表。另一个是一个Chanpionship类型的集合。下面的代码段显示了Championship类型。该类包含冠...原创 2019-12-26 13:15:09 · 422 阅读 · 0 评论 -
LINQ(内连接和左外连接)
使用join子句可以根据特定的条件合并两个数据源,但之前要获得两个要连接的列表。在一级方程式比赛中,有赛车手冠军和车队冠军。赛车手从GetChampions()方法中返回,车队从GetConstructorChampions()方法中返回。现在要获得一个年份列表,列出每年的赛车手冠军和车队冠军。为此,先定义两个查询,用于查询赛车手和车队: static void Inner...原创 2019-12-25 12:38:33 · 592 阅读 · 0 评论 -
LINQ(分组)
要根据一个关键字值对查询结果分组,可以使用group子句。现在一级方程式冠军应按照国家分组,并列出一个国家的冠军数。子句group r by r.Country into g根据Country属性组合所有的赛车手,并定义一个新的标识符g,它以后用于访问分组的结果信息。group子句的结果根据应用到分组结果上的扩展方法Count()来排序,如果冠军数相同,就根据关键字来排序,该关键字是国家,因为这是...原创 2019-12-24 16:31:29 · 3388 阅读 · 0 评论 -
LINQ(排序)
要对序列排序,前面使用了orderby子句。下面复习以下前面使用的例子,但这里使用orderby descending子句。其中赛车手按照赢得比赛的次数进行降序排序,赢得比赛的次数用关键字选择器指定: static void SortDescending() { var racers = from r in Formula1.GetCh...原创 2019-12-24 15:10:28 · 790 阅读 · 0 评论 -
LINQ(筛选)
下面介绍一些查询的示例,示例应用程序是一个控制台应用程序,使用了如下名称空间:SystemSystem.Collections.GenericSystem.Linq使用where子句,可以合并多个表达式。例如,找出赢得至少7场比赛的意大利和奥地利赛车手。传递给where子句的表达式的结果类型应是布尔类型: static void Filtering() ...原创 2019-12-24 11:15:05 · 762 阅读 · 0 评论 -
标准的查询操作符(表)
Where、OrderByDescending和Select只是LINQ定义的几个查询操作符。LINQ查询为最常用的操作符定义了一个声明语法。还有许多查询操作符可用于Enumerable类。下表列出了Enumerable类定义的标准查询操作符。...原创 2019-12-23 23:42:44 · 324 阅读 · 0 评论 -
LINQ 概述
LINQ(Language Integrated Query,语言集成查询)在C#编程语言中集成了查询语法,可以用相同的语法访问不同的数据源。LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。本章介绍LINQ的核心原理和C#中支持C# LINQ Query的语言扩展。在介绍LINQ的特性之前,本节先介绍一个简单的LINQ查询。C#提供了转换为方法调用的集成查询语言。下面说明这个转换...原创 2019-12-23 11:07:21 · 880 阅读 · 0 评论