前回の記事の続き 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)}" };
リストパターンの使いどころは、外部APIからCSV等でデータを取得して処理する際に役に立ちそうな印象を受けた
とくに、お金周りのデータだとcsv内の文字列でその行の情報を定義していたりするので
そんな時にリストパターンを使うと便利だとおもったり思わなかったり