Every time I need to prevent a value from going under a minimum or going over a maximum, I have to stop and think about how to use the Math API.  If I want to supply a max value, I need to use Math.Min; and conversely, if I want to supply a min value, I need to use Math.Max.

Given int value = 5, if I want to ensure that my value has a minimum of 10, I need to call: Math.Max(value, 10).

Given int value = 500, if I want to ensure that my value has a maximum of 100, I need to call: Math.Min(value, 100).

Yes, these functions do exactly what they say, but the way I always use them makes the API seem backwards.  The other day, I decided to solve this problem once and for all.  In my scalar extensions class in my project, I added the following methods.

   1: /// <summary>
   2: /// Return a value that is no less than a minimum
   3: /// </summary>
   4: public static int ButNoLessThan(this int value, int minimum)
   5: {
   6:   return Math.Max(value, minimum);
   7: }
   8:  
   9: /// <summary>
  10: /// Return a value that is no more than a maximum
  11: /// </summary>
  12: public static int ButNotMoreThan(this int value, int maximum)
  13: {
  14:   return Math.Min(value, maximum);
  15: }

Here’s a quick illustration:

   1: int small = 5;
   2: int large = 500;
   3:  
   4: Console.WriteLine(small.ButNoLessThan(10));
   5: Console.WriteLine(large.ButNotMoreThan(100));
   6:  
   7: Console.WriteLine((small * large).ButNoLessThan(1000).ButNotMoreThan(10000));


image