リストパターンとタプルパターン
コレクションを分解します。
「リストパターンとタプルパターン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
タプルパターン
タプルパターンは、複数の値を括弧で囲むことで、それらを一度に照合します。各位置は、それぞれ独自のサブパターンで照合されます。
これは、小さなステートマシンやじゃんけんの判定など、複数の入力に基づいて判断する処理を、1つの switch にまとめる場合に適しています。
int x = 0, y = 5;
string quadrant = (x, y) switch
{
(0, 0) => "origin",
(0, _) => "y-axis",
(_, 0) => "x-axis",
_ => "plane"
};
System.Console.WriteLine(quadrant);実行可能なタプル switch
タプルパターンを使うと、判定表を読みやすく記述できます。ここでは2つのブール値でアクションを選択します。
各アームにはタプルパターンを記述し、ある位置の破棄パターン _ は、その位置にどのような値が入っていてもよいことを示します。最後の _ アームが、それ以外のケースをすべて処理します。
using System;
class Program {
static string Move(bool fwd, bool turn) => (fwd, turn) switch {
(true, false) => "straight",
(true, true) => "curve",
(false, true) => "spin",
_ => "stop"
};
static void Main() => Console.WriteLine(Move(true, true));
}タプル内でのバインド
タプルパターン内の各位置で、値を取り出して変数に束縛できます。(0, var y) は、最初の要素が 0 で、2番目の要素を y に束縛できる場合に一致します。
束縛した変数は、アームの結果や when ガードで使用できます。これにより、照合と値の取り出しを1つの手順で組み合わせられます。
var point = (0, 7);
string r = point switch
{
(0, var y) => $"on y-axis at {y}",
(var x, 0) => $"on x-axis at {x}",
_ => "elsewhere"
};
System.Console.WriteLine(r);リストパターン
リストパターンは、角括弧を使って [1, 2, 3] のように記述し、配列やリストを要素単位で照合します。長さと各要素のパターンが一致した場合に照合が成功します。
C# 11で導入されたリストパターンを使うと、長さやインデックスを手動で確認せずに、シーケンスの形状に直接分岐できます。
int[] data = { 1, 2, 3 };
string shape = data switch
{
[] => "empty",
[_] => "one",
[_, _] => "two",
_ => "many"
};
System.Console.WriteLine(shape);要素を完全一致で照合する
リストパターンでは、位置ごとに特定の値を照合できます。[1, 2, 3] は、この3要素からなるシーケンスにだけ一致します。
定数と破棄パターンは自由に組み合わせられます。[1, _, 3] は、長さ3で、先頭が1、末尾が3のリストに一致し、中央の要素は無視します。
using System;
class Program {
static void Main() {
int[] a = { 1, 9, 3 };
bool ok = a is [1, _, 3];
Console.WriteLine(ok);
}
}スライスパターン
スライスパターン .. は、1つの位置で任意の数(0個を含む)の要素に一致します。1つのリストパターンに含められるスライスは最大1つです。
[1, .., 9] は、途中にどのような要素があっても、先頭が1で末尾が9のリストに一致します。先頭と末尾を確認する処理に適しています。
int[] nums = { 1, 4, 5, 9 };
string r = nums switch
{
[1, .., 9] => "1..9 bookends",
_ => "other"
};
System.Console.WriteLine(r);スライスを取り出す
var を使うと、スライスで読み飛ばした要素を変数に取り込めます。[first, .. var rest] のように記述します。
取り込んだ部分自体が、照合された型の配列またはリストになります。そのため、先頭の要素を分解して取り出し、残りの要素を後続の処理に利用できます。
using System;
class Program {
static void Main() {
int[] xs = { 10, 20, 30, 40 };
if (xs is [var head, .. var tail])
Console.WriteLine($"{head} then {tail.Length} more");
}
}端の要素をバインドする
スライスの前後で両端の要素をバインドできます。[var first, .., var last] は、中央を無視しながら先頭と末尾の要素を取り込みます。
これは、既知の地点から始まり、既知の地点で終わることを検証する場合など、シーケンスの境界だけが重要な処理を簡潔に記述するのに便利です。
using System;
class Program {
static void Main() {
string[] route = { "A", "B", "C", "D" };
if (route is [var start, .., var end])
Console.WriteLine($"{start} -> {end}");
}
}サブパターンを含むリストパターン
リストの各位置では、関係パターンや論理パターンなど、あらゆるパターンを使用できます。[> 0, > 0] は、正の値を2つ含むリストに一致します。
このように、パターンの機能をすべてシーケンスの照合に組み込めるため、形状と内容を1つの式で検証できます。
int[] pair = { 3, 8 };
string r = pair switch
{
[> 0, > 0] => "both positive",
[_, _] => "mixed",
_ => "wrong size"
};
System.Console.WriteLine(r);タプルとリストのネスト
タプルパターンとリストパターンは、互いの内部やプロパティパターンの内部にネストできます。タプルの各位置にリストパターンを置くことも、その逆も可能です。
これにより、ラベル付きシーケンスのような複雑な構造化データを、複数の入れ子になったチェックではなく、1つの式で照合できます。
using System;
class Program {
static void Main() {
(string, int[]) record = ("primes", new[]{ 2, 3 });
string r = record switch {
("primes", [2, ..]) => "starts with 2",
_ => "other"
};
Console.WriteLine(r);
}
}リストパターンの要件
リストパターンは、カウント可能かつインデックスアクセス可能な型で使用できます。その型には Length または Count プロパティと、インデクサーが必要です。配列、List<T>、文字列が該当します。
スライスを取り込むには、さらにスライスメソッドまたは範囲インデクサーが必要です。組み込みコレクションの多くは、これらの両方を最初からサポートしています。
string s = "cat";
bool isCat = s is ['c', 'a', 't'];
System.Console.WriteLine(isCat);理解度チェック
リストパターンとタプルパターンについての理解度を確認しましょう。
まとめ
タプルパターンは括弧内の複数の値を照合します。リストパターンは角括弧内でシーケンスの形状を照合し、.. を使ったスライスで中央の要素を var に取り込むこともできます。
各位置では任意のサブパターンを使用でき、自由にネストできます。リストパターンには、カウント可能でインデックスアクセス可能な型が必要です。これで、C# のパターン機能を一通り使えるようになりました。
よくある質問
「リストパターンとタプルパターン」レッスンは無料ですか?
はい。「リストパターンとタプルパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「リストパターンとタプルパターン」で何を学びますか?
コレクションを分解します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「リストパターンとタプルパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- switch式
- 型パターンとプロパティパターン
- 関係パターンと論理パターン
- リストパターンとタプルパターン