Search code examples
c#clamp

Where can I find the "clamp" function in .NET?


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.)


Solution

  • You could write an extension method:

    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;
    }
    

    Extension methods go in static classes - since this is quite a low-level function, it should probably go in some core namespace in your project. You can then use the method in any code file that contains a using directive for the namespace e.g.

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

    .NET Core 2.0

    Starting with .NET Core 2.0 System.Math now has a Clamp method that can be used instead:

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