0Pricing
C# Academy · レッスン

リストパターンとタプルパターン

コレクションを分解します。

「リストパターンとタプルパターン」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. switch式
  2. 型パターンとプロパティパターン
  3. 関係パターンと論理パターン
  4. リストパターンとタプルパターン
← C# Academyに戻る