Pattern matching multiple related values required nested if statements or complex boolean logic. This was particularly cumbersome when the logic depended on combinations of multiple variables.
C# 8.0 introduces tuple patterns, allowing you to match against multiple values simultaneously in a single pattern. This is especially powerful with switch expressions for writing clear, concise logic based on combinations of values.
Code
C#
public string RockPaperScissors(string player1, string player2) => (player1, player2) switch
{
("rock", "scissors") => "Player 1 wins",
("scissors", "paper") => "Player 1 wins",
("paper", "rock") => "Player 1 wins",
("scissors", "rock") => "Player 2 wins",
("paper", "scissors") => "Player 2 wins",
("rock", "paper") => "Player 2 wins",
_ => "Draw"
};C#
public string RockPaperScissors(string player1, string player2)
{
if ((player1 == "rock" && player2 == "scissors") ||
(player1 == "scissors" && player2 == "paper") ||
(player1 == "paper" && player2 == "rock"))
return "Player 1 wins";
if ((player1 == "scissors" && player2 == "rock") ||
(player1 == "paper" && player2 == "scissors") ||
(player1 == "rock" && player2 == "paper"))
return "Player 2 wins";
return "Draw";
}Notes
- Create a tuple of values to match against:
(value1, value2) switch { ... } - Each arm matches against a tuple pattern:
(pattern1, pattern2) => result - Use
_as a discard pattern to match any value for that position - Supports constant patterns, type patterns, and
varpatterns within tuple positions - Particularly useful for state machines, game logic, or any multi-variable decision logic
- Order matters - the first matching pattern wins
- Type pattern improvements C# 9.0 added relational patterns and
or/andcombinators that can be used within tuple positions