Linq查询操作之投影操作
投影操作,乍一看不知道在说啥。那么什么是投影操作呢?其实就是Select操作,名字起的怪怪的。和Linq查询表达式中的select操作是一样的。它能够选择数据源中的元素,并指定元素的表现形式。投影操作包括以下2种操作:
1、Select操作,将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。
2、SelectMany操作,也可以将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。但该操作可以将该函数应用到多个序列之上,并将结果合并成一个序列。
下面我们逐一看一下这两个操作。
Select操作
Select操作,将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。和Linq查询表达式中的select操作相似。Select操作将一个函数应用到一个序列上,并产生一个新的序列。Enumerable的Select()原型如下:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
其中source表示数据源,selector表示映射元素的转换函数。TSource指定参数类型,TResult指定selector函数的返回值类型。
下面我们创建一个整型数组ints,包含10个元素。使用select来计算每个元素除以5的余数。
private void SlectQuery()
{
int[] ints = new int[]; for (int i = ; i < ; i++) ints[i] = i; //查询数据
var result = ints.Select(x => x%); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
我们看看输出结果:
SelectMany操作
SelectMany和Select比较相似,主要区别是可以将一个函数应用到多个序列上,并将结果合并成一个新的序列。Enumerable的SelectMany()操作的原型如下:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
source表示数据源,selector表示映射元素的转换函数。collectionSelector表示映射元素的转换函数的集合。下面我们来做个具体实例来看一看.
1.创建两个整型数组intA,intB。他们的值分别是{1,2,3},{4,5,6},
2、创建一个List<int[]>的序列,并将intA和intB数组添加到该序列中。
3、使用SelectMany操作List<int[]>序列
我们先用Select操作:
private void SlectManyQuery()
{
int[] intsA = new int[] {,,};
int[] intsB = new int[] { , ,}; IList<int[]> lst = new List<int[]>(); lst.Add(intsA); lst.Add(intsB); //查询数据
var result = lst.Select(x=>x); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
看下结果:
我们现在用SelectMany操作:
private void SlectManyQuery()
{
int[] intsA = new int[] {,,};
int[] intsB = new int[] { , ,}; IList<int[]> lst = new List<int[]>(); lst.Add(intsA); lst.Add(intsB); //查询数据
var result = lst.SelectMany(x=>x); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
看看操作结果:
我们看到Select操作只是对List对象进行操作,而SelectMany是对List<int[]>中的每一项操作最后合并成一个新的结果集。
我们可以通过源码开对比:
Select操作最终调用的迭代器:
我们可以看出它只对数据源进行一次foreach迭代。
SelectMany操作:
SelectMany操作,可以看出首先进行foreach迭代,在迭代里面再对数据集的每一项进行一个foreach迭代。所以SelectMany能够对多个序列进行操作后合并结果。
Linq查询操作之投影操作的更多相关文章
- Trident中的解析包含的函数操作与投影操作
一:函数操作 1.介绍 Tuple本身是不可变的 Function只是在原有的基础上追加新的tuple 2.说明 如果原来的字段是log,flag 新增之后的tuple可以访问这些字段,log,fla ...
- C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作
连载目录 [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...
- Linq查询操作之排序操作
在Linq中排序操作可以按照一个或多个关键字对序列进行排序.其中第一个排序关键字为主要关键字,第二个排序关键字为次要关键字.Linq排序操作共包含以下5个基本的操作. 1.OrderBy操作,根据排序 ...
- Linq查询操作之Where筛选
筛选操作where能够处理逻辑运算符组成的逻辑表达式.比如逻辑“与”,逻辑“或”,并从数据源中筛选数据,它和where子句的功能非常相似.Enumerable类的Where()原型如下: public ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- Linq对XML的简单操作
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- 转载Entity Framework 5.0(EF first)中的添加,删除,修改,查询,状态跟踪操作
转载原出处:http://www.cnblogs.com/kenshincui/p/3345586.html Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以 ...
- C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换
LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...
随机推荐
- 用git写书
apebook.org www.apebook.org 最好的程序员图书免费托管服务 apebook 提供了 gitbook.com 类似的云端图书托管能力,图书基于广受欢迎的 gitbook 工具 ...
- 用飞信监控GoldenGate进程
监控GoldenGate进程 1) 在goldengate安装目录下建立文件ogginfo $vim ogginfo info all 2) 配置飞信报警 ...
- VC++ 学习笔记(序):神一样的语言
总的来说,我觉得VC++是一门神一样的语言——它是公认最强大.最复杂的:它一切以效率为第一要务,却又不肯落伍,拼命兼容现在的新的语言设计特点.本来在别的语言很容与就避开的问题,在这里要用很高的技巧去设 ...
- DataInputStream类和RandomAccessFile类的使用方法
// DataInputStream类实现了DataInput接口,要想从文件中读入二进制数据, // 你需要将DataInputStream与某个字节源相结合,例如FileInputStream / ...
- C#如何更好地理解引用类型和值类型
说道值类型和引用类型,在C#中,官方的说法就是: 值类型直接指向数据:一般包括C#自带的所有数字类型,字符类型,bool类型,当然还有自定义的结构类型和枚举类型 而引用类型则是指向数据存储的地址.一般 ...
- iOS开发问题之Could not instantiate class named NSLayoutConstraint
这个问题在ios6.0之前的版本中运行会出现,因为使用Xcode 4.5之后的版本新建项目默认是选中AutoLayout的,但这个特性是在iOS6.0之后的版本中才支持的. 解决办法是选中.stroy ...
- 网站CSS选择器性能讨论
CSS选择符由一些初始化参数组成,这些参数指明了要应用这个CSS规则的页面元素.作为一个网站的前端开发工程师,应该避免编写一些常见的开销很大的CSS选择符模式,尽量编写高效的CSS选择符,从而加快页面 ...
- 针对 SQL Server 2008 在Windows Server 2008上的访问配置 Windows 防火墙
现在Windows Server 2008 服务器用的越来越多,2008的防火墙比2003的有了很大的增强,安全性有了更大的提高. 甚至80端口的出站默认都是被关闭的.所以如果在2008Server上 ...
- 查看kernel log命令
adb shell "cat /dev/kmsg | grep -Ei "gesture""
- The file 'MemoryStream' is corrupted! 的解决办法
The file 'MemoryStream' is corrupted! Remove it and launch unity again! [Position > ] 有时候我们会遇到这个报 ...