Le code ci-dessous prend en charge la spécification de limites dans n'importe quel ordre (c'est bound1 <= bound2
-à- dire ou bound2 <= bound1
). J'ai trouvé cela utile pour les valeurs de serrage calculées à partir d'équations linéaires ( y=mx+b
) où la pente de la ligne peut être croissante ou décroissante.
Je sais: le code se compose de cinq opérateurs d'expression conditionnelle super-laids . Le fait est que cela fonctionne et les tests ci-dessous le prouvent. N'hésitez pas à ajouter des parenthèses strictement inutiles si vous le souhaitez.
Vous pouvez facilement créer d'autres surcharges pour d'autres types numériques et copier / coller les tests.
Attention: comparer des nombres à virgule flottante n'est pas simple. Ce code n'implémente pas les double
comparaisons de manière robuste. Utilisez une bibliothèque de comparaison à virgule flottante pour remplacer les utilisations des opérateurs de comparaison.
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;
}
}
Tests 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);
}
}