The SelectMany linq method 'flattens' an IEnumerable<IEnumerable<T>>
into an IEnumerable<T>
. All of the T elements within the IEnumerable
instances contained in the source IEnumerable
will be combined into a single IEnumerable
.
var words = new [] { "a,b,c", "d,e", "f" };
var splitAndCombine = words.SelectMany(x => x.Split(','));
// returns { "a", "b", "c", "d", "e", "f" }
If you use a selector function which turns input elements into sequences, the result will be the elements of those sequences returned one by one.
Note that, unlike Select()
, the number of elements in the output doesn't need to be the same as were in the input.
More real-world example
class School
{
public Student[] Students { get; set; }
}
class Student
{
public string Name { get; set; }
}
var schools = new [] {
new School(){ Students = new [] { new Student { Name="Bob"}, new Student { Name="Jack"} }},
new School(){ Students = new [] { new Student { Name="Jim"}, new Student { Name="John"} }}
};
var allStudents = schools.SelectMany(s=> s.Students);
foreach(var student in allStudents)
{
Console.WriteLine(student.Name);
}
Output:
Bob
Jack
Jim
John