LINQ学习笔记:选取Select(3)

http://www.itjxue.com  2015-07-17 01:59  来源:未知  点击次数: 

SelectMany

参数列表:

源序列: IEnumerable

结果选择器(Result Selector): TSource=>IEnumerabel 或者(TSource, int)=>IEnumerable(LINQ to SQL不支持)

概要:

SelectMany将多个子序列连接成一个扁平的输出序列.

对于每一个输入元素,Select生成一个输出元素,相反的,SelectMany则生成了0…n个的输出元素.这些0…n的元素来自于处理结果或者Lambda表达式产生的子序列

SelectMany可以被用于扩展子序列,平整嵌套集合,以及联合两个集合来生成一个扁平的输出序列. 假设我们有一个名称如下的名字列表:

   1: string[] fullNames =
   2:  
   3:     { “Anne Williams”, “John Fred Smith”, “Sue Green” };

 

我们希望能够将它转换为一个扁平的单字结果集,如下所示:

“Anne”,“Williams”,“John”,“Fred”,“Smith”,“Sue”,“Green”

SelectMany对于这个任务是非常理想的,因为对于每一个输入元素我们将会得到对应的多个输出元素 . 我们需要做的就是提供一个selector表达式来将输入元素转化为一个输出子序列.String.Split()可以很好的完成一个工作:

   1: string testInputElement = “Anne Williams”;
   2:  
   3: string[] childSequence  = testInputElement.Split( );
   4:  
   5:   // childSequence = { “Anne”, “Williams” };

 

完整示例如下:

   1: IEnumerable<string> query =
   2:  
   3:          fullNames.SelectMany (name => name.Split( ));
   4:  
   5:        foreach (string name in query)
   6:  
   7:          Console.Write (name + “,”);
   8:  
   9:          // 结果: Anne,Williams,John,Fred,Smith,Sue,Green,

 

如果我们使用Select的话也可以使用如下的方法得到一样的结果:

   1: IEnumerable<string[]> query =
   2:  
   3:   fullNames.Select (
   4:  
   5:     name => name.Split( ));
   6:  
   7: foreach (string[] stringArray in query)
   8:  
   9:   foreach (string name in stringArray)
  10:  
  11:       Console.Write (name + “,”);

 

SelectMany的好处就是它生成了单一扁平的结果序列.

通过一个额外的生成符——额外的from语句可以让复合语法支持SelectMany.这个from关键字拥有两层意思,在查询开始的那一个引出了迭代变量和输入序列,查询中其他地方出现的from关键字将被翻译成SelectMany:

   1: IEnumerable<string> query =
   2:  
   3:   from fullName in fullNames
   4:  
   5:   from name in fullName.Split()
   6:  
   7:     select name;

 

注意,第二个from引出了一个新的查询变量——这本例中,是name.从那时起,这个新的变量将会变成迭代变量,而原始的迭代变量将会变成外部迭代变量.

(责任编辑:IT教学网)

更多

推荐ASP.NET教程文章