Bird
Raised Fist0
C Sharp (C#)programming~10 mins

SelectMany for flattening in C Sharp (C#) - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - SelectMany for flattening
Start with collection of collections
↓
Apply SelectMany
↓
Flatten inner collections
↓
Create single flat collection
↓
Use or output flat collection
SelectMany takes a collection of collections and flattens it into one single collection by combining all inner elements.
Execution Sample
C Sharp (C#)
var numbers = new List<List<int>> {
    new List<int> {1, 2},
    new List<int> {3, 4},
    new List<int> {5}
};
var flat = numbers.SelectMany(x => x).ToList();
This code flattens a list of lists of integers into one list of integers.
Execution Table
StepCurrent Outer ElementInner ElementsActionFlat Collection State
1[1, 2]1, 2Add 1, 2 to flat collection[1, 2]
2[3, 4]3, 4Add 3, 4 to flat collection[1, 2, 3, 4]
3[5]5Add 5 to flat collection[1, 2, 3, 4, 5]
ExitNo more outer elements-Stop flattening[1, 2, 3, 4, 5]
💡 All inner lists processed, flat collection complete
Variable Tracker
VariableStartAfter 1After 2After 3Final
flatempty[1, 2][1, 2, 3, 4][1, 2, 3, 4, 5][1, 2, 3, 4, 5]
Key Moments - 2 Insights
Why does SelectMany flatten the inner lists instead of keeping them nested?
SelectMany takes each inner collection and adds its elements directly to the result, so the output is a single flat list, as shown in execution_table rows 1-3.
What happens if the inner collections are empty?
If an inner collection is empty, SelectMany adds nothing for that step, so the flat collection stays the same, similar to skipping that row in the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the flat collection after step 2?
A[1, 2]
B[1, 2, 3, 4]
C[3, 4]
D[1, 2, 3]
💡 Hint
Check the 'Flat Collection State' column at step 2 in the execution_table.
At which step does the flat collection first contain the number 5?
AStep 1
BStep 2
CStep 3
DExit step
💡 Hint
Look at the 'Inner Elements' and 'Flat Collection State' columns in the execution_table.
If the second inner list was empty, how would the flat collection look after step 3?
A[1, 2, 5]
B[1, 2, 3, 4, 5]
C[5]
D[1, 2]
💡 Hint
Consider that an empty inner list adds no elements, so the flat collection skips those.
Concept Snapshot
SelectMany flattens collections of collections into one collection.
Syntax: collection.SelectMany(inner => inner)
It takes each inner collection and adds its elements to a single flat list.
Useful to simplify nested lists into one list.
Remember: output has no nested structure after flattening.
Full Transcript
This visual execution shows how SelectMany works in C#. We start with a list of lists of integers. SelectMany takes each inner list and adds its elements to a new flat list. Step by step, the flat list grows as elements from each inner list are added. When all inner lists are processed, the flat list contains all elements in one sequence. This helps beginners see how nested collections become flat using SelectMany.

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

  1. Step 1: Understand the structure of nested lists

    A list of lists means you have many small lists inside one big list.
  2. Step 2: Role of SelectMany

    SelectMany takes each small list and combines all their elements into one big flat list.
  3. Final Answer:

    It flattens the nested lists into a single list containing all elements. -> Option C
  4. 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

  1. Step 1: Understand SelectMany syntax

    SelectMany expects a function that returns an inner collection to flatten.
  2. 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.
  3. Final Answer:

    var flat = numbers.SelectMany(x => x); -> Option A
  4. 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

  1. Step 1: Understand SelectMany flattening

    SelectMany flattens all inner lists into one list: [1,2,3,4,5].
  2. Step 2: Output formatting

    string.Join with "," joins elements with commas, so output is "1,2,3,4,5".
  3. Final Answer:

    1,2,3,4,5 -> Option D
  4. 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

  1. Step 1: Analyze the lambda inside SelectMany

    The lambda uses w => w.Length, which returns an int, not a collection.
  2. Step 2: Understand SelectMany requirements

    SelectMany expects a function returning a collection to flatten, not a single int value.
  3. Final Answer:

    Using w.Length returns int, not a collection, causing a compile error. -> Option B
  4. 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

  1. Step 1: Understand the goal

    We want all grades above 80 from all students combined.
  2. Step 2: Use SelectMany with filtering inside

    s => s.Grades.Where(g => g > 80) filters grades > 80 inside SelectMany, flattening only those grades.
  3. 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).
  4. Final Answer:

    s => s.Grades.Where(g => g > 80) -> Option A
  5. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard