110

I would like to clamp a value x to a range [a, b]:

x = (x < a) ? a : ((x > b) ? b : x);

This is quite basic. But I do not see a function "clamp" in the class library - at least not in System.Math.

(For the unaware to "clamp" a value is to make sure that it lies between some maximum and minimum values. If it’s greater than the max value, then it’s replaced by the max, etc.)

4

10 に答える 10

158

拡張メソッドを書くことができます:

public static T Clamp<T>(this T val, T min, T max) where T : IComparable<T>
{
    if (val.CompareTo(min) < 0) return min;
    else if(val.CompareTo(max) > 0) return max;
    else return val;
}

拡張メソッドは静的クラスに配置されます。これは非常に低レベルの関数であるため、おそらくプロジェクトのコア名前空間に配置する必要があります。その後、名前空間の using ディレクティブを含む任意のコード ファイルでメソッドを使用できます。

using Core.ExtensionMethods

int i = 4.Clamp(1, 3);

.NET コア 2.0

.NET Core 2.0 以降でSystem.Mathは、Clamp代わりに使用できるメソッドが用意されています。

using System;

int i = Math.Clamp(4, 1, 3);
于 2010-04-21T13:53:10.507 に答える
26

試す:

public static int Clamp(int value, int min, int max)  
{  
    return (value < min) ? min : (value > max) ? max : value;  
}
于 2010-06-14T20:14:25.563 に答える
13

ありませんが、作るのはそれほど難しくありません。ここで見つけました:クランプ

それは:

public static T Clamp<T>(T value, T max, T min)
    where T : System.IComparable<T> {
        T result = value;
        if (value.CompareTo(max) > 0)
            result = max;
        if (value.CompareTo(min) < 0)
            result = min;
        return result;
    }

そして、次のように使用できます。

int i = Clamp(12, 10, 0); -> i == 10
double d = Clamp(4.5, 10.0, 0.0); -> d == 4.5
于 2010-04-21T13:51:47.220 に答える
10

System.Math名前空間にはありません。

XNA ゲーム スタジオMathHelperで使用できるクラスがあります。

于 2010-04-21T13:51:15.207 に答える
0

以前の回答を使用して、必要に応じて以下のコードに要約しました。これにより、最小値または最大値のみで数値をクランプすることもできます。

public static class IComparableExtensions
{
    public static T Clamped<T>(this T value, T min, T max) 
        where T : IComparable<T>
    {
        return value.CompareTo(min) < 0 ? min : value.ClampedMaximum(max);
    }

    public static T ClampedMinimum<T>(this T value, T min)
        where T : IComparable<T>
    {
        return value.CompareTo(min) < 0 ? min : value;
    }

    public static T ClampedMaximum<T>(this T value, T max)
        where T : IComparable<T>
    {
        return value.CompareTo(max) > 0 ? max : value;
    }
}
于 2017-12-11T21:58:27.763 に答える