以前一直都是直接用也没有系统的学习一下,最近出去面试受挫很多,也让自己下定目标补充更多的理论知识。以前一直以为 Select 和 SelectMany 没啥太多区别。
今天看Linq 实战发现还是有一些区别的。
如果我们看这两个扩展函数的定义很容易明白——
Select是把要遍历的集合IEnumerable逐一遍历,每次返回一个T,合并之后直接返回一个IEnumerable,
SelectMany则把原有的集合IEnumerable每个元素遍历一遍,每次返回一个IEnumerable,把这些IEnumerable的“T”合并之后整体返回一个IEnumerable。
于是我们写代码可能就有了这样的差别:
var tmp=books.Select(book => book.Authors); foreach(var authors in tmp) { foreach(var author in authors) { Console.WriteLine(author.LastName); } } var tmp1=books.SelectMany(book => book.Authors); foreach(var authors in tmp1) { Console.WriteLine(author.LastName); }
使用Select运算符返回的是一个由数据源对象数组组成的序列,而SelectMany 是吧这些数组拆分开来组成一个序列并返回。