5

実行時に値が入力される変数があります。その値が 2 つの同じデータ型の値 (最小値と最大値など) の間にあるかどうか、または拡張メソッドを使用していないかどうかを確認したいと思います。

みたいにチェックしたい

int a = 2; //here static but is can be changed at runtime

if(a.Between(0,8))
   DoSomething();
else
   DoNothing();

aが 0 または 8 またはそれらの間の任意の値である場合、 を返す必要がありますtrue

a(-1 以下) または (9 以上) の場合は、返されます。false

のような拡張メソッドを作成したい

public static bool Between<T1>(this T1 val1, T1 lowest, T1 highest) where ????
{
    What code to write here???? 
}
4

3 に答える 3

15

次のように実行できます。

public static bool Between<T>(this T actual, T lower, T upper) where T : IComparable<T>
{
    return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) <= 0;
}

ここを参照

または、コレクションでそれを行いたい場合は、これを行うことができます:

public static IEnumerable<TSource> Between<TSource, TResult>
(
    this IEnumerable<TSource> source, Func<TSource, TResult> selector,
    TResult lowest, TResult highest
)
    where TResult : IComparable<TResult>
{
    return source.OrderBy(selector).
        SkipWhile(s => selector.Invoke(s).CompareTo(lowest) < 0).
        TakeWhile(s => selector.Invoke(s).CompareTo(highest) <= 0 );
}

ここを参照

使用法:

var tenTo40 = list.Between(s => s, 10, 40);
于 2012-05-09T06:50:41.333 に答える
1

タイプを混在させると難しくなります。T1 が datetime で t2 が int の場合、どのような動作が予想されますか?

IComparable インターフェイスを使用できるすべての方法で 1 つの型のみを使用する

public static bool Between<T>(this T self, T lower,T higher) where T : IComparable
{
    return self.CompareTo(lower) >= 0 && self.CompareTo(higher) <= 0;
}
于 2012-05-09T06:49:55.370 に答える
1

多分このように:

public static bool Between<T1, T2>(this T1 val1, T2 lowest, T2 highest) where T1 : IComparable where T2 : IComparable {
    return val1.CompareTo(lowest) > 0 && val1.CompareTo(highest) < 0;
}
于 2012-05-09T06:54:56.863 に答える