Aşağıdaki kod, sınırların herhangi bir sırada (yani bound1 <= bound2
, veya bound2 <= bound1
) belirlenmesini destekler . Bunu y=mx+b
, çizginin eğiminin arttığı veya azaldığı doğrusal denklemlerden ( ) hesaplanan kenetleme değerleri için yararlı buldum .
Biliyorum: Kod, beş süper çirkin koşullu ifade operatöründen oluşur . Mesele şu ki, işe yarıyor ve aşağıdaki testler bunu kanıtlıyor. İsterseniz, kesinlikle gereksiz parantezler eklemekten çekinmeyin.
Diğer sayısal türler için başka aşırı yüklemeleri kolayca oluşturabilir ve temel olarak testleri kopyalayabilir / yapıştırabilirsiniz.
Uyarı: Kayan noktalı sayıları karşılaştırmak kolay değildir. Bu kod, double
karşılaştırmaları sağlam bir şekilde gerçekleştirmez. Karşılaştırma operatörlerinin kullanımlarını değiştirmek için bir kayan nokta karşılaştırma kitaplığı kullanın.
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 testleri:
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);
}
}