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