SelectMany
in C# is a method used primarily with LINQ (Language-Integrated Query) to project each element of a sequence to an IEnumerable<T>
and flatten the resulting sequences into one sequence. In simpler terms, it helps you deal with collections within collections by merging them into a single collection.
Here’s a simple breakdown:
- Single Collection Transformation (
Select
):Select
is used when you want to transform each element of a collection. For example, if you have a list of numbers and you want to get their squares, you would useSelect
.
var numbers = new List<int> { 1, 2, 3, 4 };
var squares = numbers.Select(n => n * n); // Result: { 1, 4, 9, 16 }
2. Flattening Nested Collections (SelectMany
):
SelectMany
is used when you have a collection of collections and you want to flatten them into a single collection. For example, if you have a list of lists and you want to combine all the inner lists into one single list, you useSelectMany
.
var listOfLists = new List<List<int>>
{
new List<int> { 1, 2, 3 },
new List<int> { 4, 5, 6 },
new List<int> { 7, 8, 9 }
};
var flatList = listOfLists.SelectMany(innerList => innerList); // Result: { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Example to Illustrate
Imagine you have a list of students, and each student has a list of grades. You want to create a single list of all grades from all students. Here’s how you can use SelectMany
to achieve this:
public class Student
{
public string Name { get; set; }
public List<int> Grades { get; set; }
}
var students = new List<Student>
{
new Student { Name = "Alice", Grades = new List<int> { 90, 85, 92 } },
new Student { Name = "Bob", Grades = new List<int> { 78, 81, 86 } },
new Student { Name = "Charlie", Grades = new List<int> { 88, 94, 91 } }
};
// Use SelectMany to flatten the list of grades into a single list
var allGrades = students.SelectMany(student => student.Grades);
// Result: { 90, 85, 92, 78, 81, 86, 88, 94, 91 }
In this example, SelectMany
takes each student’s list of grades and merges them into one continuous list of grades.
Key Points:
Select
is used for a one-to-one transformation.SelectMany
is used for one-to-many transformations and flattening nested collections.
By using SelectMany
, you can effectively handle and simplify operations on nested collections in C#.