我想将一个值钳位x到一个范围[a, b]:
x = (x < a) ? a : ((x > b) ? b : x);
Run Code Online (Sandbox Code Playgroud)
这是非常基本的.但是我没有在类库中看到函数"clamp" - 至少在类库中没有System.Math.
(因为不知道"钳制"一个值是为了确保它位于某些最大值和最小值之间.如果它大于最大值,则它被最大值替换,等等.)
Lee*_*Lee 122
你可以写一个扩展方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:扩展方法进入静态类 - 因为这是一个相当低级的函数,它可能应该放在项目的某个核心命名空间中.然后,您可以在包含命名空间的using指令的任何代码文件中使用该方法,例如
using Core.ExtensionMethods
int i = 4.Clamp(1, 3);
Run Code Online (Sandbox Code Playgroud)
从.NET Core 2.0开始,System.Math现在有一个Clamp可以使用的方法:
using System;
int i = Math.Clamp(4, 1, 3);
Run Code Online (Sandbox Code Playgroud)
小智 25
尝试:
public static int Clamp(int value, int min, int max)
{
return (value < min) ? min : (value > max) ? max : value;
}
Run Code Online (Sandbox Code Playgroud)
d7s*_*rai 24
只需使用Math.Min和Math.Max:
x = Math.Min(Math.Max(x, a), b);
Run Code Online (Sandbox Code Playgroud)
Jer*_* B. 13
没有一个,但制作一个并不难.我在这里找到了一个:钳
它是:
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;
}
Run Code Online (Sandbox Code Playgroud)
它可以像:
int i = Clamp(12, 10, 0); -> i == 10
double d = Clamp(4.5, 10.0, 0.0); -> d == 4.5
Run Code Online (Sandbox Code Playgroud)
kem*_*002 10
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
System.Math.Clamp如果您使用的是 .NET 5+、.NET Core 3.x 或 .NET Core 2.x,则这是您想要的方法。
var a = Math.Clamp(5, 1, 10); // = 5
var b = Math.Clamp(-99, 1, 10); // = 1
var c = Math.Clamp(99, 1, 10); // = 10
Run Code Online (Sandbox Code Playgroud)