[C#][VB] 値の範囲内チェックを行う拡張メソッド

[C#][VB] 値の範囲内チェックを行う拡張メソッド

値が範囲内かどうかをチェックしたい

例えばある日付型の値をある期間内にあるかどうかのチェックを行ったり、あるいは数値が一定範囲内かどうかをチェックしたりするメソッドが欲しかったので拡張メソッドで作成してみました。

IComparable

比較できる型の値であれば、数値であれ日付であれこのような範囲チェックを行うことができます。これらの比較ができる型は、IComparable インターフェイスを実装しています。なのでこのインターフェイスを実装している型について拡張メソッドを定義します。

ジェネリックを使い型制約でIComparableが実装されていることを制約条件として付与します。IComparable インターフェイスは、CompareToメソッドを持つのでこれで値の比較をします。

CompareTo

val1.CompareTo(val2)とすることで、val1とval2を比較することができます。戻り値は以下のようになります。

戻り値 説明
-1 val1がval2より小さい
(val1 < val2)
0 val1とval2が等しい
(val1 = val2)
1 val1がval2より大きい
(val1 > val2)

サンプル

C#

using System;

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine($"{1.IsRange(1, 10)}");       // True
        Console.WriteLine($"{10.IsRange(1, 10)}");      // True
        Console.WriteLine($"{100.IsRange(1, 10)}");     // False

        // DateTime型の範囲チェック
        var from = DateTime.Parse("2016/11/21");
        var to = DateTime.Parse("2016/12/21");
        Console.WriteLine($"{DateTime.Now.IsRange(from, to)}");
    }
}

// 拡張メソッド
public static class Extensions
{
    public static bool IsRange<T>(this T val, T fromValue, T toValue) where T : IComparable
    {
        if (0 <= val.CompareTo(fromValue))
        {
            if (val.CompareTo(toValue) <= 0)
            {
                return true;
            }
        }
        return false;
    }
}

VB.NET

Imports System
Imports System.Runtime.CompilerServices

public class Program
    public shared sub Main
        Console.WriteLine($"{1.IsRange(1, 10)}")        ' True
        Console.WriteLine($"{10.IsRange(1, 10)}")       ' True
        Console.WriteLine($"{100.IsRange(1, 10)}")      ' False

        ' DateTime型の範囲チェック
        Dim fromDate As DateTime = DateTime.Parse("2016/11/21")
        Dim toDate As DateTime = DateTime.Parse("2016/12/21")
        Console.WriteLine($"{DateTime.Now.IsRange(fromDate, toDate)}")
    End sub
End class

' 拡張メソッド
Module Extensions
    <Extension()>
    Public Function IsRange(Of T As {IComparable})(ByVal val As T, ByVal fromValue As T, ByVal toValue As T) As Boolean
        If 0 <= val.CompareTo(fromValue) Then
            If val.CompareTo(toValue) <= 0 Then
                Return True
            End If
        End If
        Return False
    End Function
End Module

C#カテゴリの最新記事