Positional patterns in C Sharp (C#) - Time & Space Complexity
We want to understand how long it takes for a program using positional patterns to run as the input grows.
Specifically, how does the time change when matching patterns in data structures?
Analyze the time complexity of the following code snippet.
record Point(int X, int Y);
string DescribePoint(Point p) => p switch
{
(0, 0) => "Origin",
(var x, 0) => $"X={x} on X-axis",
(0, var y) => $"Y={y} on Y-axis",
(var x, var y) => $"Point at ({x},{y})"
};
This code uses positional patterns to check where a point lies and returns a description.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Matching the input point against each pattern in the switch.
- How many times: Each call checks up to 4 patterns in order until one matches.
Each point checked runs through the same fixed number of pattern checks.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 40 pattern checks (10 points x 4 patterns) |
| 100 | About 400 pattern checks |
| 1000 | About 4000 pattern checks |
Pattern observation: The number of operations grows directly with the number of points checked.
Time Complexity: O(n)
This means the time to run grows in a straight line as you check more points.
[X] Wrong: "Positional patterns make the code run slower exponentially because of multiple checks."
[OK] Correct: Each pattern check is constant time and fixed in number, so total time grows linearly with input size, not exponentially.
Understanding how pattern matching scales helps you explain your code's efficiency clearly and confidently.
What if we added more patterns to the switch? How would the time complexity change?
Practice
What is the main purpose of positional patterns in C#?
record Point(int X, int Y);
Using case Point(var x, var y): inside a switch statement helps to:
Solution
Step 1: Understand positional pattern usage
Positional patterns allow matching an object and extracting its parts in one step, likecase Point(var x, var y):.Step 2: Identify what the pattern does with Point
It extracts the X and Y values from the Point object into variables x and y for use inside the case block.Final Answer:
Extract values of X and Y from a Point object easily -> Option AQuick Check:
Positional pattern extracts values [OK]
- Thinking positional patterns create or modify objects
- Confusing Deconstruct method call with pattern matching
- Assuming positional patterns only check types without extracting
Which of the following is the correct syntax for using a positional pattern with a record Person(string Name, int Age) inside a switch expression?
switch(person) {
case ???:
// code
break;
}Solution
Step 1: Recall positional pattern syntax
Positional patterns use parentheses with variables:Type(var1, var2).Step 2: Match syntax to options
Person(var name, var age) uses parentheses and variables correctly:Person(var name, var age). Others use invalid syntax for positional patterns.Final Answer:
Person(var name, var age) -> Option AQuick Check:
Positional pattern syntax uses parentheses [OK]
- Using square brackets or curly braces instead of parentheses
- Trying to use named arguments syntax inside patterns
- Omitting var keyword or variable names
What is the output of the following code?
record Point(int X, int Y);
var p = new Point(3, 4);
switch (p)
{
case Point(0, 0):
Console.WriteLine("Origin");
break;
case Point(var x, var y) when x == y:
Console.WriteLine("On diagonal");
break;
case Point(var x, var y):
Console.WriteLine($"Point at ({x}, {y})");
break;
}Solution
Step 1: Check first case Point(0, 0)
p is (3,4), so it does not match (0,0).Step 2: Check second case with condition x == y
x=3, y=4, so x != y; condition fails.Step 3: Third case matches any Point and prints coordinates
It matches and prints "Point at (3, 4)".Final Answer:
Point at (3, 4) -> Option BQuick Check:
Pattern matches last case with output [OK]
- Assuming (3,4) matches (0,0)
- Ignoring the when condition in second case
- Thinking no case matches and no output
Identify the error in this code snippet using positional patterns:
record Rectangle(int Width, int Height);
var rect = new Rectangle(5, 10);
switch(rect)
{
case Rectangle(var w, var h):
Console.WriteLine($"Width: {w}, Height: {h}");
break;
case Rectangle(w, h):
Console.WriteLine("Invalid pattern");
break;
}Solution
Step 1: Review positional pattern variable declaration
Variables in positional patterns must be declared withvaror a type.Step 2: Identify error in second case
Second case usesRectangle(w, h)withoutvar, which is invalid syntax.Final Answer:
Second case uses variables without var keyword, causing a syntax error -> Option CQuick Check:
Variables need var keyword in patterns [OK]
- Omitting var keyword for variables in patterns
- Thinking records can't be used in switch
- Confusing named arguments with pattern variables
Given the record Person(string Name, int Age), write a switch expression using positional patterns that returns:
- "Child" if Age < 13
- "Teen" if Age is between 13 and 19 inclusive
- "Adult" otherwise
Which of the following switch expressions correctly implements this?
Solution
Step 1: Check age ranges and conditions
Child: age < 13, Teen: 13 ≤ age ≤ 19, Adult: otherwise.Step 2: Analyze each option's conditions
person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; correctly usesage < 13for Child,age >= 13 && age <= 19for Teen, and default Adult case. person switch { Person(_, var age) when age < 13 => "Child", Person(_, var age) when age > 13 && age <= 19 => "Teen", Person(_, _) => "Adult" }; misses age=13 (falls to Adult) because Teen condition uses > 13. person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age > 13 && age < 19 => "Teen", _ => "Adult" }; excludes age == 13 and 19 for Teen. person switch { Person(var name, var age) when age <= 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; overlaps Child and Teen at age 13.Step 3: Confirm the correct implementation
person switch { Person(var name, var age) when age < 13 => "Child", Person(var name, var age) when age >= 13 && age <= 19 => "Teen", Person(var name, var age) => "Adult" }; matches all conditions correctly and clearly.Final Answer:
Option D code correctly implements the age groups -> Option DQuick Check:
Check age ranges carefully in when clauses [OK]
- Overlapping or missing age boundaries
- Using _ wildcard instead of variables when needed
- Incorrect logical operators in conditions
Ready to prove it?
Pass the test and this pattern moves unknown
