将序列的每个元素投影到 IEnumerable<T> 并将结果序列合并为一个序列。
解释1:选取元素内部的集合,并重新合并到新集合中
解释2:平展元素内部的集合到新的集合中,每个元素内部的集合都是新集合的一部分
1:一个序列的每个元素投影 System.Collections.Generic.IEnumerable`1, ,并将合并为一个序列将结果序列。 每个源元素的索引用于该元素的投影表。
IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)
案例:在每个车子前面加上赛车手全名,然后选取赛车手使用车子的数组中仅包含法拉利的车子,最后再按照车名称排序。
1.1:foreach解析:
这里仍然使用赛车手的数据:赛车手请参考:C#-linq实战003-查询-Where
//由于OrderBy属于延迟非流式,需要加载所有数据,所以不在foreach中展示
//IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)
//source:Formula1.GetChampions()
//source:TSource->racerper
//selector:TSource->racerper
//selector:int->ri
int ri = 0;
foreach (var racerper in Formula1.GetChampions())
{
//selector:IEnumerable<TResult>->racerper.Cars
foreach (var car in racerper.Cars)
{
if (car.Contains("Ferrari"))
{
if (ri > 0)
{
Console.WriteLine(racerper.FirstName + " " + racerper.LastName + ":" + car);
}
else
{
Console.WriteLine(car + ":" + ri.ToString());
}
}
}
ri++;
}