Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8901

[C# 8.0] 整数の範囲とのパターンマッチ

$
0
0

C# 8.0から使用できるswitch式で、整数の範囲とマッチさせたい場合、破棄パターン+when句で下記のようになります。

varnum=100;varrsult=inputswitch{_when1<=num&&num<13=>"special",_=>"",};

これでも十分ですが、どうせならC# 8.0から導入されたSystem.Range構造体(1..13)を使用したいです。
しかし、System.Range構造体は配列内の範囲を表すことを想定されて設計されているため、特定の値が含まれるかどうかを判定するメソッドがありません。

Enumerable.Range()メソッドを使えばもう少し綺麗に書けますが、ヒープにオブジェクトが作成されるのが少し嫌なので拡張メソッドを用意します。

拡張メソッド

staticclassRangeExtention{publicstaticboolContains(thisRangerange,intvalue){varstart=range.Start.IsFromEnd?(int.MaxValue-range.Start.Value):range.Start.Value;varend=range.End.IsFromEnd?(int.MaxValue-range.End.Value):range.End.Value;if(start>end)thrownewArgumentOutOfRangeException(nameof(range));returnstart<=value&&value<end;}}
varnum=100;varrsult=inputswitch{_when(1..13).Contains(num)=>"special",_=>"",};

注意点

System.Range構造体を使用するので、制約があります。

  • 型はintしか使用できない。
  • 値の範囲は0以上しか使用できない。(Enumerable.Range()メソッドを使えば負値も可能)
  • (2..0)のような、大小関係が逆転している範囲は例外を投げるようにしている。
  • 半閉区間しか使用できない。
    (System.Range構造体の想定は半閉区間なのでそれに従っている。)

Viewing all articles
Browse latest Browse all 8901

Trending Articles