.NET에서 "클램프"기능은 어디에서 찾을 수 있습니까?
값 x
을 범위 로 고정하고 싶습니다 [a, b]
.
x = (x < a) ? a : ((x > b) ? b : x);
이것은 아주 기본적인 것입니다. 하지만 클래스 라이브러리에서 "클램프"함수를 볼 수 없습니다 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);
.NET Core 2.0
.NET Core 2.0부터는 System.Math
이제 Clamp
대신 사용할 수 있는 메서드가 있습니다.
using System;
int i = Math.Clamp(4, 1, 3);
시험:
public static int Clamp(int value, int min, int max)
{
return (value < min) ? min : (value > max) ? max : value;
}
사용 Math.Min
하고 Math.Max
:
x = Math.Min(Math.Max(x, a), b);
하나는 없지만 만드는 것이 너무 어렵지 않습니다. 여기에서 하나를 찾았습니다. 클램프
그것은:
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
XNA 게임 스튜디오에서 사용할 수있는 MathHelper 클래스가 있습니다.
http://msdn.microsoft.com/en-us/library/bb197892(v=XNAGameStudio.31).aspx
가능한 경우 해결 된 의견의 문제 및 우려 사항과 함께 Lee의 솔루션 을 공유하기 만하면됩니다 .
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의 주석 참조 ). - Does appropriate
null check
on all inputs (See @JeppeStigNielsen's comment). - Swaps
min
andmax
ifmin > max
(See @JeppeStigNielsen's comment).
Limitations: No one-sided clamps. If max
is NaN
, always returns NaN
(See Herman's comment).
Using the previous answers, I condensed it down to the below code for my needs. This will also allow you to clamp a number only by its min or max.
public static class IComparableExtensions
{
public static T Clamped<T>(this T value, T min, T max)
where T : IComparable<T>
{
return value.CompareTo(min) < 0 ? min : value.ClampedMaximum(max);
}
public static T ClampedMinimum<T>(this T value, T min)
where T : IComparable<T>
{
return value.CompareTo(min) < 0 ? min : value;
}
public static T ClampedMaximum<T>(this T value, T max)
where T : IComparable<T>
{
return value.CompareTo(max) > 0 ? max : value;
}
}
The below code supports specifying bounds in any order (i.e. bound1 <= bound2
, or bound2 <= bound1
). I've found this useful for clamping values calculated from linear equations (y=mx+b
) where the slope of the line can be increasing or decreasing.
I know: The code consists of five super-ugly conditional expression operators. The thing is, it works, and the tests below prove it. Feel free to add strictly unnecessary parentheses if you so desire.
You can easily create other overloads for other numeric types and basically copy/paste the tests.
Warning: Comparing floating point numbers is not simple. This code does not implement double
comparisons robustly. Use a floating point comparison library to replace the uses of comparison operators.
public static class MathExtensions
{
public static double Clamp(this double value, double bound1, double bound2)
{
return bound1 <= bound2 ? value <= bound1 ? bound1 : value >= bound2 ? bound2 : value : value <= bound2 ? bound2 : value >= bound1 ? bound1 : value;
}
}
xUnit/FluentAssertions tests:
public class MathExtensionsTests
{
[Theory]
[InlineData(0, 0, 0, 0)]
[InlineData(0, 0, 2, 0)]
[InlineData(-1, 0, 2, 0)]
[InlineData(1, 0, 2, 1)]
[InlineData(2, 0, 2, 2)]
[InlineData(3, 0, 2, 2)]
[InlineData(0, 2, 0, 0)]
[InlineData(-1, 2, 0, 0)]
[InlineData(1, 2, 0, 1)]
[InlineData(2, 2, 0, 2)]
[InlineData(3, 2, 0, 2)]
public void MustClamp(double value, double bound1, double bound2, double expectedValue)
{
value.Clamp(bound1, bound2).Should().Be(expectedValue);
}
}
참고URL : https://stackoverflow.com/questions/2683442/where-can-i-find-the-clamp-function-in-net
'programing' 카테고리의 다른 글
동일한 출력을 생성하는 JavaScript의 encodeURIComponent에 해당하는 Java? (0) | 2020.09.18 |
---|---|
Rails를 사용하여 정수형 열이 아닌 기본 키를 어떻게 설정할 수 있습니까? (0) | 2020.09.18 |
동일한 문자열에 대한 JSTL if 태그 (0) | 2020.09.18 |
더 높은 종류의 유형은 언제 유용합니까? (0) | 2020.09.18 |
EJS 템플릿 (JMVC)에서 조건문을 사용할 수 있습니까? (0) | 2020.09.17 |