我在哪里可以find.NET中的“钳”function?

我想钳位一个值到一个范围[a, b]

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

这是非常基本的。 但是我没有在类库中看到一个“钳制”的function – 至less不是在System.Math

(对于不知道“夹”的值是确保它位于最大值和最小值之间,如果大于最大值,则用最大值代替)

你可以写一个扩展方法:

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

尝试:

 public static int Clamp(int value, int min, int max) { return (value < min) ? min : (value > max) ? max : value; } 

没有一个,但做一个并不难。 我在这里find一个: 钳

它是:

 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 

System.Math名称空间中没有一个

http://msdn.microsoft.com/en-us/library/system.math_members.aspx

有一个MathHelper类可用于XNA游戏工作室,如果这恰好是你在做什么:

http://msdn.microsoft.com/en-us/library/bb197892(v=XNAGameStudio.31).aspx

只要使用Math.MinMath.Max

 x = Math.Min(Math.Max(x, a), b); 

在可能的情况下,将Lee的解决scheme与解决的问题和疑虑分享:

 public static T Clamped<T>(this T value, T min, T max) where T : IComparable<T> { if (value == null) throw new ArgumentNullException(nameof(value), "is null."); if (min == null) throw new ArgumentNullException(nameof(min), "is null."); if (max == null) throw new ArgumentNullException(nameof(max), "is null."); //If min <= max, clamp if (min.CompareTo(max) <= 0) return value.CompareTo(min) < 0 ? min : value.CompareTo(max) > 0 ? max : value; //If min > max, clamp on swapped min and max return value.CompareTo(max) < 0 ? max : value.CompareTo(min) > 0 ? min : value; } 

区别:

  • 方法名称使用适当的动词时态( ed )来(进一步)表明该值不是就地钳位的,而是返回一个新的值(参见@ JimBalter的注释 )。
  • 对所有input进行适当的null check (请参阅@ JeppeStigNielsen的评论 )。
  • 如果min > max max则交换minmax (请参阅@ JeppeStigNielsen的评论 )。

限制:没有单侧夹子。 如果maxNaN ,则总是返回NaN (参见Herman的评论 )。