なんかいろいろと書いてくブログ

関東のどこかで働く、一般人

【C# 11 Preview】リストパターン

前回の記事の続き C# 11 Previewを触ってみようというはなし 今回はVisual Studio 2022 17.1 から使えるリストパターンについての話

注意

この記事はC# 11 Previewに関する記事になります

C# 11の仕様については今後変更される可能性があります 

リスト パターン

パターンマッチングに新しく、リストに対するパターンの追加が検討されているようです
(その他のパターンはこちらを参照)

パターンマッチングはis もしくはswitchで検証できます

以下引用

  • 任意のパターンを任意の要素に適用し、個々の要素が特定の特性に一致するかどうかを確認できます。
  • 破棄パターン (_) は 1 つの要素に一致します。
  • "範囲パターン" (..) は、シーケンス内の 0 個以上の要素に一致する可能性があります。 リスト パターンには、最大 1 つの範囲パターンを使用できます。
  • var パターンを使うと、1 つの要素、または要素の範囲をキャプチャできます。

使用方法は要素に対して、[]で検証します

int[] array = { 1, 2, 3 };

Console.WriteLine(array is [1, 2, 3]); // true
Console.WriteLine(array is [1, 2, 5]); // false

_を使用すると一部要素との検証も可能

int[] array = { 1, 2, 3 };

Console.WriteLine(array is [_, _, _]); // true
Console.WriteLine(array is [_, 2, _]); // true
Console.WriteLine(array is [_, 3, _]); // false

また、..を使用すると範囲検索で検証できる

int[] array = { 1, 2, 3, 4, 5};

Console.WriteLine(array is [1, .., 4, _]); // true
Console.WriteLine(array is [1, 5, ..]); // false

この範囲検索は少し扱いずらい印象 例えば、以下のパターンだと検証に失敗する
どうやら、検証したい値の前後がどうなっているかの検証が必要のよう

Console.WriteLine(array is [1, .., 3, _]); // false
Console.WriteLine(array is [1, .., 4]); // false

前後の要素にも注意を払う必要があるもよう
'..'による検証

また、範囲パターンは最大一つのみしか使えないとのこと

複数回使用するとコンパイラーが発生する
最大一つのみ

最後に、var を使うと中身のキャプションを取得することができる (書き方は、開発者blogを参考に書いています)

int[] array = { 1, 2, 3, 4, 5 };

var result = method(array);
Console.WriteLine(result);

static string method(int[] array)
   => array switch
   {
       [1, .. var middle, _] => $"Middle {String.Join(", ", middle)}",
       [.. var all] => $"All {String.Join(", ", all)}"
   };

varステートメントで値のキャプションを保持できる
var


リストパターンの使いどころは、外部APIからCSV等でデータを取得して処理する際に役に立ちそうな印象を受けた
とくに、お金周りのデータだとcsv内の文字列でその行の情報を定義していたりするので
そんな時にリストパターンを使うと便利だとおもったり思わなかったり