📖 Scenario: Imagine you have a list of classrooms, and each classroom has a list of students. You want to get a single list of all students from all classrooms combined.
🎯 Goal: Build a C# program that uses SelectMany to flatten a list of student lists into one list of all students.
📋 What You'll Learn
Create a list of classrooms where each classroom is a list of student names (strings).
Create a variable to hold all students flattened into one list using SelectMany.
Print the flattened list of all students.
💡 Why This Matters
🌍 Real World
Flattening nested collections is common when working with grouped data, like classrooms with students or departments with employees.
💼 Career
Understanding how to flatten collections with SelectMany is useful for data processing, reporting, and simplifying complex data structures in C# applications.
Progress0 / 4 steps
1
Create the nested list of classrooms
Create a variable called classrooms that is a List<List<string>> with exactly these three classrooms: 1. "Alice", "Bob" 2. "Charlie", "David" 3. "Eve", "Frank"
C Sharp (C#)
Hint
Use List<List<string>> and initialize it with three inner lists of strings.
2
Add a variable to hold the flattened list
Create a variable called allStudents of type IEnumerable<string> but do not assign it yet.
C Sharp (C#)
Hint
Use IEnumerable<string> to declare allStudents without assigning it yet.
3
Use SelectMany to flatten the classrooms
Assign allStudents to the result of using SelectMany on classrooms to flatten all inner lists into one sequence of strings.
C Sharp (C#)
Hint
Use classrooms.SelectMany(classroom => classroom) to flatten the list.
4
Print the flattened list of all students
Use a foreach loop to print each student in allStudents on its own line.
C Sharp (C#)
Hint
Use foreach (string student in allStudents) and Console.WriteLine(student) inside the loop.
Practice
(1/5)
1. What does the SelectMany method do in C# when used on a list of lists?
easy
A. It sorts each inner list individually.
B. It filters the outer list based on a condition.
C. It flattens the nested lists into a single list containing all elements.
D. It creates a dictionary from the nested lists.
Solution
Step 1: Understand the structure of nested lists
A list of lists means you have many small lists inside one big list.
Step 2: Role of SelectMany
SelectMany takes each small list and combines all their elements into one big flat list.
Final Answer:
It flattens the nested lists into a single list containing all elements. -> Option C
Quick Check:
SelectMany flattens nested lists = B [OK]
Hint: SelectMany flattens nested lists into one list fast [OK]
Common Mistakes:
Thinking SelectMany sorts or filters instead of flattening
Confusing SelectMany with Select which keeps nested structure
Assuming SelectMany creates dictionaries
2. Which of the following is the correct syntax to flatten a list of lists List numbers using SelectMany?
easy
A. var flat = numbers.SelectMany(x => x);
B. var flat = numbers.Select(x => x);
C. var flat = numbers.SelectMany(x => x.ToString());
D. var flat = numbers.SelectMany(x => x.Count());
Solution
Step 1: Understand SelectMany syntax
SelectMany expects a function that returns an inner collection to flatten.
Step 2: Check each option
var flat = numbers.SelectMany(x => x); returns each inner list as is, which is correct. var flat = numbers.Select(x => x); uses Select, not flattening. Options C and D return wrong types (string and int), not collections.
Final Answer:
var flat = numbers.SelectMany(x => x); -> Option A
Quick Check:
SelectMany with identity function flattens = A [OK]
Hint: Use SelectMany with identity function to flatten lists [OK]
Common Mistakes:
Using Select instead of SelectMany
Returning non-collections inside SelectMany
Trying to flatten by counting elements
3. What is the output of the following code?
var data = new List {
new List<int> {1, 2},
new List<int> {3, 4},
new List<int> {5}
};
var result = data.SelectMany(x => x).ToList();
Console.WriteLine(string.Join(",", result));
medium
A. 12345
B. 1,2;3,4;5
C. System.Collections.Generic.List`1[System.Int32]
D. 1,2,3,4,5
Solution
Step 1: Understand SelectMany flattening
SelectMany flattens all inner lists into one list: [1,2,3,4,5].
Step 2: Output formatting
string.Join with "," joins elements with commas, so output is "1,2,3,4,5".
Final Answer:
1,2,3,4,5 -> Option D
Quick Check:
Flattened list joined by commas = D [OK]
Hint: SelectMany flattens, string.Join prints with commas [OK]
Common Mistakes:
Expecting nested list output instead of flat
Confusing ToString output of list object
Missing commas in output
4. Identify the error in this code snippet that tries to flatten a list of lists:
List words = new() {
new List<string> {"apple", "banana"},
new List<string> {"cat", "dog"}
};
var flatWords = words.SelectMany(w => w.Length).ToList();
medium
A. The list initialization syntax is incorrect.
B. Using w.Length returns int, not a collection, causing a compile error.
C. Missing parentheses after SelectMany call.
D. ToList() cannot be called after SelectMany.
Solution
Step 1: Analyze the lambda inside SelectMany
The lambda uses w => w.Length, which returns an int, not a collection.
Step 2: Understand SelectMany requirements
SelectMany expects a function returning a collection to flatten, not a single int value.
Final Answer:
Using w.Length returns int, not a collection, causing a compile error. -> Option B
Quick Check:
SelectMany needs collections, not int = C [OK]
Hint: SelectMany lambda must return collections, not single values [OK]
Common Mistakes:
Returning single values instead of collections in SelectMany
Confusing Length property with collection
Assuming ToList() causes error
5. Given a list of students where each student has a list of grades, how would you use SelectMany to get a list of all grades above 80 from all students?
class Student {
public string Name { get; set; }
public List<int> Grades { get; set; }
}
List<Student> students = new() {
new Student { Name = "Anna", Grades = new List<int> { 90, 70 } },
new Student { Name = "Ben", Grades = new List<int> { 85, 60 } }
};
// Fill in the blank to get all grades > 80
var highGrades = students.SelectMany(__________).ToList();
hard
A. s => s.Grades.Where(g => g > 80)
B. s => s.Grades
C. s => s.Name
D. s => s.Grades.Count
Solution
Step 1: Understand the goal
We want all grades above 80 from all students combined.
Step 2: Use SelectMany with filtering inside
s => s.Grades.Where(g => g > 80) filters grades > 80 inside SelectMany, flattening only those grades.
Step 3: Why not others?
s => s.Grades flattens all grades, including low ones like 70 and 60. Options C and D return wrong types (string and int).
Final Answer:
s => s.Grades.Where(g => g > 80) -> Option A
Quick Check:
SelectMany with filtered inner lists = A [OK]
Hint: Filter inside SelectMany to flatten only needed items [OK]
Common Mistakes:
Flattening all grades without filtering
Returning non-collections in SelectMany
Using wrong property like Name or Count
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.