LINQ学习笔记:选取Select(3)
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.从那时起,这个新的变量将会变成迭代变量,而原始的迭代变量将会变成外部迭代变量.