Der folgende Code unterstützt die Angabe von Grenzen in beliebiger Reihenfolge (dh bound1 <= bound2
oder bound2 <= bound1
). Ich fand dies nützlich für Klemmwerte, die aus linearen Gleichungen ( y=mx+b
) berechnet wurden, bei denen die Steigung der Linie zunehmen oder abnehmen kann.
Ich weiß: Der Code besteht aus fünf superhässlichen Operatoren für bedingte Ausdrücke . Die Sache ist, es funktioniert und die folgenden Tests beweisen es. Fühlen Sie sich frei, streng unnötige Klammern hinzuzufügen, wenn Sie dies wünschen.
Sie können problemlos andere Überladungen für andere numerische Typen erstellen und die Tests grundsätzlich kopieren / einfügen.
Warnung: Der Vergleich von Gleitkommazahlen ist nicht einfach. Dieser Code implementiert double
Vergleiche nicht robust. Verwenden Sie eine Gleitkomma-Vergleichsbibliothek, um die Verwendung von Vergleichsoperatoren zu ersetzen.
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);
}
}