Kode di bawah ini mendukung penentuan batas dalam urutan apapun (yaitu bound1 <= bound2
, atau bound2 <= bound1
). Saya telah menemukan ini berguna untuk nilai penjepitan yang dihitung dari persamaan linier ( y=mx+b
) di mana kemiringan garis dapat meningkat atau menurun.
Saya tahu: Kode ini terdiri dari lima operator ekspresi bersyarat yang sangat jelek . Masalahnya, itu berhasil , dan tes di bawah ini membuktikannya. Jangan ragu untuk menambahkan tanda kurung yang tidak perlu jika Anda menginginkannya.
Anda dapat dengan mudah membuat kelebihan lain untuk tipe numerik lain dan pada dasarnya menyalin / menempel tes.
Peringatan: Membandingkan bilangan floating point tidaklah mudah. Kode ini tidak menerapkan double
perbandingan dengan baik. Gunakan pustaka perbandingan titik mengambang untuk menggantikan penggunaan operator perbandingan.
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 tes:
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);
}
}