Наведений нижче код підтримує вказівку меж у будь-якому порядку (тобто bound1 <= bound2
, або bound2 <= bound1
). Я знайшов це корисним для затискання значень, розрахованих з лінійних рівнянь ( y=mx+b
), де нахил лінії може збільшуватися або зменшуватися.
Я знаю: Код складається з п’яти надпотворних операторів умовних виразів . Справа в тому, що це працює , і тести нижче підтверджують це. Не соромтеся додавати суворо непотрібні дужки, якщо ви цього бажаєте.
Ви можете легко створити інші перевантаження для інших числових типів і в основному скопіювати / вставити тести.
Попередження: Порівняти числа з плаваючою комою непросто. Цей код не реалізує double
порівняння надійно. Використовуйте бібліотеку порівняння з плаваючою комою, щоб замінити використання операторів порівняння.
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:
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);
}
}