登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

精通 LINQ数据访问技术 --投影操作  

2010-07-12 12:24:41|  分类: C#技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

5.3  投影操作

在LINQ中,投影操作和SQL语句中的 SELECT子句功能相似,它能够选择数据源中的元素,并指定元素的表现形式。投影操作包括以下2种操作。

  ● Select操作,将数据源中的元素投影到新序列中,并指定元素的类型和表现形式。

  ● SelectMany操作,也可以将数据源中的元素投影到新序列中,并指定元素的类型和表现形式。但是,SelectMany操作可以将一个函数应用到多 个序列之上,并将结果合并为一个序列。

5.3.1  选择操作Select

Select操作能够将数据源中的元素投影到新序列 中,并指定元素的类型和表现形式,它和select子句的功能相似。Select操作将一个函数应用到一个序列之上,并产生另外一个序列。 Enumerable类的Select()方法的原型如下。

public static IEnumerable<TResult> Select<TSource, TResult>(

this IEnumerable<TSource> source,Func<TSource, TResult> selector)

其中,source参数表示数据 源,selector参数表示映射元素的转换函数。TSource指定source参数中的元素的类型,TResult指定selector参数返回值的 类型。

下面的代码实例中的SelectQuery()函数 演示了Select操作映射并产生数据的方法,具体步骤说明如下。

(1)创建整型数组ints,该数组包含100个元 素。

(2)使用Select操作计算元素除以5的余数。

(3)使用foreach语句输出上述查询操作的结 果。

private void SelectQuery()

         {   ///构建数据源

                   int[] ints = new int[100];

                   for(int i = 0; i < 100; i++)ints[i] = i;

                   ///查询数据

                   var values = ints.Select(i => i % 5);

                   ///显示查询结果

                   foreach(var v in values)

                   {

                            Response.Write(v + "</br>");

                   }

         }

SelectQuery()函数执行Select操 作之后的结果和数据源对比如表5.3所示。

表5.3  Select操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

users(包含100个元素,分别为0、1、2、3、4、5、…、99)

Select(i => i % 5)

values(包含100个元素,分别为0、1、2、3、4、0、1、2、3、4、0、…、5)


5.3.2  选择多个序列操作SelectMany

SelectMany操作和Select操作比较相 似,它也可以将数据源中的元素投影到新序列中,并指定元素的类型和表现形式。但是,SelectMany操作可以将一个函数应用到多个序列之上,并将结果 合并为一个序列。Enumerable类的SelectMany ()方法的4种原型如下。

(1)public static IEnumerable<TResult> SelectMany<TSource, TResult>(

this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)

(2)public static IEnumerable<TResult> SelectMany<TSource, TResult>(

this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)

(3)public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(

this IEnumerable<TSource> source,Func<TSource, IEnumerable<TCollection>> collectionSelector,

Func<TSource, TCollection, TResult> resultSelector)

(4)public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(

this IEnumerable<TSource> source,Func<TSource, int, IEnumerable<TCollection>> collectionSelector,

Func<TSource, TCollection, TResult> resultSelector)

source参数表示数据源。selector参数 表示映射元素的转换函数。collectionSelector参数表示映射元素的转换函数的集合,集合中的每一个函数对于一个序列。 resultSelector参数表示应用于中间序列的转换函数。TSource指定source参数中的元素的类型,TResult指定 selector参数返回值的类型,TCollection指定collectionSelector参数收集的中间元素的类型。

下面代码实例中的 SelectManyQuery()函数演示了SelectMany操作映射并产生数据的方法,具体步骤说明如下。

(1)创建两个整形数组intsOne和 intsTwo,它们的值分别为“{1,2,3}”和“{4,5,6}”。

(2)创建一个类型为 List<int[]>的序列,并将intsOne和intsTwo数组添加到该序列中。

(3)使用SelectMany操作查询 List<int[]>序列中的每一个元素,结果保存在values变量中。

(4)使用foreach语句输出上述查询操作的结 果。

private void SelectManyQuery()

         {   ///构建数据源

                   int[] intsOne = {1,2,3};

                   int[] intsTwo = {4,5,6};

                   ///添加intsOne和intsTwo到list列表中

                   List<int[]> list = new List<int[]>();

                   list.Add(intsOne);

                   list.Add(intsTwo);

                   ///查询两个序列中的所有元素

                   var values = list.SelectMany(i => i);                    

                   ///显示查询结果

                   foreach(var v in values){Response.Write(v + "</br>");}

}

SelectManyQuery()函数执行 SelectMany操作之后的结果和数据源对比如表5.4所示。

表5.4  SelectMany操作前后的数据对比

数据源

查询表达式/操作

查询结果

说明

intsOne={1,2,3}

intsTwo ={4,5,6}

SelectMany(i => i)

values={1,2,3,4,5,6}


  评论这张
 
阅读(900)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018