LINQ Enumerable
System.Linq.Enumerable类,提供了数十种称为扩展方法的共享方法,帮助您操作所有实现IEnumerable(of T)接口的类中的数据。由于Enumerable类的扩展方法可以处理许多其他类如(包括Array和List),因此不仅可以使用Enumerable类的方法来创建LINQ查询,还可以用它来操作数组和其他数据结构的行为。
查看Enumerable类扩展方法的文档,你会发现每个成员都为Shared。因此可以通过两种方案来调用方法。
第一种方案:按照声明类型的方法来调用,即传入扩展类的实例
Dim itemcount = Enumerable.Count(query, Function(prod) prod.Equals("Chang"))
第二种方案:想操作集合本身的实例方法一样,调用扩展方法,不必提供第一个参数
Dim itemCount1 = queryAgain.Count(Function(qS) qS.Equals("Chang"))
从经过排序的数据中取得前10项,扩展方法Take:从序列的开头返回指定数量的连续元素。
Dim query = _
db.Products.Where(Function(product) product.CategoryId = 1) _
.OrderBy(Function(product) product.ProductName) _
.Select(Function(product) product.ProductName) _
.Take(10)
创建序列
Enumerable类提供了多个shared方法,但他们不是扩展方法,我们先从这些简单的方法开始。
Enumerable.Range
Enumerable.Range方法创建一个新的整数有序列表。可指定列表的起始值和项目数。此方法将返回一个IEnumerable(of Integer)序列。下面代码,使用Range方法填充列表,然后使用一个简单的lambda表达式调用Enumerable.orderby方法,按随机顺序排列序列。
Dim rad As New System.Random
Dim items = Enumerable.Range(1, 10)
Dim randomList = items.OrderBy(Function() rad.Next())
多次运行代码时,每次返回不同的结果。
Enumberable.Reverse
Enumberable.Reverse方法以相反顺序返回输入序列。
Dim items = Enumerable.Range(1, 10)
Dim reversed = items.Reverse()
Enumerable.Repeat
Enumerable.Repeat方法创建包括指定值,且按指定次数重复的一个列表。
Dim repeated = Enumerable.Repeat("Hello", 6)
执行代码后,repeated变量为
Hello, Hello, Hello, Hello, Hello, Hello
选择序列
Enumerable.select
Enumerable.select方法将每个元素投影成新的格式。
Dim db As New SimpleDataContext
Dim results = db.Customers.Where(Function(customer) customer.Country = "USA") _
.Select(Function(customer, index) _
String.Format("{0}.{1}", index + 1, customer.ContactName))
Enumerable.selectMany
Enumerable.selectMany方法获取一个项目集合,其中的每个项目可能又是一个项目集合,然后将两维输入缩成一维输出序列。例如,如果需要获取种类列表,每个种类又包括多个产品,并最终得到具有对应种类信息的产品列表,此方法会非常有用。
Dim db As New SimpleDataContext
Dim categories = db.Categories _
.Where(Function(category) category.Products.Count < 7) Dim reuslts = categories.SelectMany( _
Function(category, index) category.Products.Select( _
Function(product) String.Format("{0}.Category {1}:{2}", _
index, product.CategoryId, product.ProductName)))
在此示例中,传到selectMany方法的lambda表达式接受对特定种类的引用(依次处理每个种类)。selectMany方法的这一特定重载将种类的索引以及种类一起传递给 lambda 表达式。有了种类及其索引后,lambda 表达式将针对种类的 Products 属性调用 Select 方法,允许它处理种类中的每个产品。此示例返回包含以下字符串列表的一个序列。调用 SelectMany 将原始种类/产品层次结构平铺成单个值列表。
检索单个元素
你常常会需要检索和处理序列中的单个元素。Enumerable类提供了多种方法来将序列内容筛选成单个元素。
Enumerable.First、Enumerable.Last
Enumerable.first和Enumerable.last方法分别返回序列中的第一个和最后一个元素。
Enumerable.Single
给定指定单个元素的函数或者Lambda表达式后,Enumerable.Single方法将返回一个元素。
Enumerable.ElementAt
Enumerable.ElementAt方法将返回位于序列中特定索引位置的一个元素。
如果序列中并不存在请求的元素(对于Single方法而言,如果限制条件导致出现零个元素或多个元素),上述每种方法都会抛出异常。它们还允许指定一个lambda表达式或函数来限制输入数据。在任何情况下,结果序列必须包含一个元素。
Enumerable 类还提供类似方法,它在条件允许时返回单个元素,否则返回序列类型的默认成员。这些方法是 Enumerable.FirstOrDefault、Enumerable.LastOrDefault、Enumerable.SingleOrDefault 和 Enumerable.ElementAtOrDefault。
筛选序列
Enumerable.where、Enumerable.Distinct或者Enumerable.OfType方法筛选现有序列的内容,即可返回输出序列中原始数据的子集。
Enumerable.OfType
Enumerable.OfType方法基于指定类型筛选输入序列。假设希望仅针对窗体上特定类型的控件执行操作。通过使用OfType方法,可以限制窗体公开的控件集合并仅遍历相关的控件子集。
Dim items As New List(Of Object)
items.Add("January")
items.Add(0)
items.Add("Monday")
items.Add(3)
items.Add(5)
items.Add("September") Dim numbers = items.OfType(Of Integer)()
Dim strings = items.OfType(Of String)()
代码运行后的,两个输出列表,包含以下数据:
0, 3, 5
January, Monday, September
Enumerable.Where
Enumerable.where方法允许指定筛选输入序列的条件。第二个重载版本可访问集合中每个项目的索引,以便根据索引执行筛选。
Dim files As IEnumerable(Of FileInfo) = _
New DirectoryInfo("C:\Windows").GetFiles()
Dim fileResults = _
files.Where(Function(file) file.Length < 100) _
.Select(Function(file) String.Format("{0} ({1})", file.Name,file.Length))
上面代码中,New DirectoryInfo("C:\Windows").GetFiles()返回的是,System.IO.FileInfo 类型数组。由于数组实现了IEnumerable接口,因此可使用where方法筛选数组内容。
fileResults = _
files.Where(Function(file, index) ((file.Length < 100) And (index < 20))) _
.Select(Function(file) String.Format("{0} ({1})", file.Name, file.Length))
Enumerable.Distinct
Enmerable.Distinct方法可筛选列表,使输出序列仅包含输入列表中单独存在的项目。对应简单的值(字符串、数字等),此过程非常简单。
对于复杂对象列表,运行时引擎如何才能通过比较确定两个对象是否重复?无法简单地比较实例变量,这一点与在实际操作中仅比较对象的地址不同。对于复杂对象,必须提供一个比较器,即实现IEqualityComparer(Of T)执行比较。
LINQ Enumerable的更多相关文章
- 整理一下 System.Linq.Enumerable 类中的那些比较少用的方法
Linq 虽然用得多,但是里面有一些方法比较少用,因此整理一下.Enumerable 类的所有方法可以在 MSDN 上查阅到:https://msdn.microsoft.com/zh-cn/libr ...
- System.ExecutionEngineException: Attempting to JIT compile method System.Linq.Enumerable
关于JIT编译和AOT编译的问题.IOS下是不支持JIT动态编译的,所以如果程序有涉及JIT编译的都会无法执行. 在google查过说unity是不支持部分的Linq功能,如Sort方法. 但我在un ...
- LINQ Enumerable 续
筛选序列 Enumerable.Distinct 对于复杂的对象列表,运行时引擎如何才能通过比较确定两个对象是否重复?对于复杂对象,必须提供一个比较器,即实现IEqualityComparer(Of ...
- 几种查询方法(lambda Linq Enumerable静态类方式)
1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { ...
- Linq Enumerable.Distinct方法去重
Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...
- LINQ Enumerable 续 II
Enumerable.TakeWhile和Enumerable.SkpWhile Enumerable.TakeWhile和Enumerable.SkpWhile将通过判断条件,来获取和跳过序列. T ...
- System.Linq.Enumerable 中的方法 Aggregate 函数
语法: public static TSource Aggregate<TSource>( this IEnumerable<TSource> source, Func&l ...
- FCL研究-LINQ-System.Linq Enumerable
.net 里面集合操作极为方便,尤其是实现了IEnumerable接口的集合,一直在使用,系统的研究一下集合的操作也是极好的. 类型 操作符名称 投影操作符 Select,SelectMany 限制操 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
随机推荐
- .NET垃圾回收与内存泄漏
相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不会发生内存泄漏 ...
- MyBatis学习笔记(3)—— 利用mybatis灌入假数据
由于第三方厂商未能按时提供实时数据,故需要纯手动导入一些实时数据,用于统计分析.正好最近自己学习了mybatis .因此使用mybatis 配置一个select.insert 的简单操作语句,用于灌入 ...
- 137 Single Number II(找唯一数Medium)
题目意思:一个int数组,有一个数只出现一次,其他数均出现三次,找到这个唯一数 思路: 1.将所有数用2进制表示,计算每一位的数字和 1*3*n1+0*3*n2+c 唯一数对应位的数字(0或者1 ...
- ActiveX相关
ActiveX 1.创建ActiveXhttp://blog.csdn.net/fww330666557/article/details/6533118 继承IObjectSafety接口http:/ ...
- Python Django开始
1.创建工程 C:\procedure\projects>django-admin startproject mysite 2.同步数据库 C:\procedure\projects\mysit ...
- 转:基于科大讯飞语音API语音识别开发详解
原文来自于: http://www.52wulian.org/android_voice/ 最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了And ...
- 转:一些MongoDB限制
文章来自于:http://www.infoq.com/cn/news/2013/11/mongodb-things 消耗磁盘空间 这是我的第一个困惑:MongoDB会消耗太多的磁盘空间了.当然了,这与 ...
- WINDOWS自启动程序的10大隐身之所
Windows启动时通常会有一大堆程序自动启动.不要以为管好了“开始→程序→启动”菜单就万事大吉,实际上,在Windows XP/2K中,让Windows自动启动程序的办法很多,下文告诉你最重要的两个 ...
- spring framework 4 源码阅读
前面写了几篇spring 的介绍文章,感觉与主题不是很切合.重新整理下思路,从更容易理解的角度来写下文章. spring 的骨架 spring 的骨架,也是spring 的核心包.主要包含三个内容 1 ...
- 【模拟】XMU 1599 斐波那契汤
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1599 题目大意: 给k,m,q以及f[1]...f[k],当n<m时,f[n]= ...