Il codice seguente supporta la specifica dei limiti in qualsiasi ordine (ad esempio bound1 <= bound2
, o bound2 <= bound1
). L'ho trovato utile per i valori di bloccaggio calcolati da equazioni lineari (y=mx+b
) in cui la pendenza della linea può essere crescente o decrescente.
Lo so: il codice è composto da cinque terribili operatori di espressioni condizionali . Il fatto è che funziona e i test seguenti lo dimostrano. Sentiti libero di aggiungere parentesi strettamente inutili se lo desideri.
Puoi facilmente creare altri overload per altri tipi numerici e sostanzialmente copiare / incollare i test.
Avvertenza: confrontare i numeri in virgola mobile non è semplice. Questo codice non implementa i double
confronti in modo affidabile. Utilizzare una libreria di confronto in virgola mobile per sostituire gli usi degli operatori di confronto.
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 test:
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);
}
}