I’ve come up with a pretty neat solution to this:

If you don’t want to write the same method for different data types, you can use generics.

///
/// Math Class that helps
///
public static class MathHelper
{
///
/// Clamps value within desired range
///
///Value to be clamped
///Min range
///Max range
/// Clamped value within range
public static int Clamp(int value, int min, int max)
{
if (value > max)
return max;
if (value < min)
return min;
return value;
}
///
/// Clamps value within desired range
///
///Value to be clamped
///Min range
///Max range
/// Clamped value within range
public static float Clamp(float value, float min, float max)
{
if (value > max)
return max;
if (value < min)
return min;
return value;
}
///
/// Clamps value within desired range
///
///Value to be clamped
///Min range
///Max range
/// Clamped value within range
public static double Clamp(double value, double min, double max)
{
if (value > max)
return max;
if (value < min)
return min;
return value;
}
}

It’s pretty easy once you know what to look for :) Just search Generics c# and you’ll find a bunch of questions and answers on StackOverflow, msdn and CodeProject :)

Here’s the solution:

///
/// Math Class that helps
///
public static class MathHelper
{
///
/// Clamps value within desired range
/// This is a generic. So use any type you want
///
///Value to be clamped
///Min range
///Max range
/// Clamped value within range
public static T Clamp(T value, T min, T max)
where T : IComparable
{
T result = value;
if (result.CompareTo(max) > 0)
result = max;
if (result.CompareTo(min) < 0)
result = min;
return result;
}
}

Pretty Cool eh!? :)

Now instead of having multiple methods to make the same operation, you have one that works for many types.

int val = MathHelper.Clamp(-1, 0, 2); // for ints
float val = MathHelper.Clamp(-1.0f, 0.0f, 2.0f); // for floats
double val = MathHelper.Clamp(-1.0d, 0.0d, 2.0d); // for doubles