値が範囲内かどうかをチェックしたい
例えばある日付型の値をある期間内にあるかどうかのチェックを行ったり、あるいは数値が一定範囲内かどうかをチェックしたりするメソッドが欲しかったので拡張メソッドで作成してみました。
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
コメントを書く