รหัสด้านล่างนี้รองรับการระบุขอบเขตตามลำดับใด ๆ (เช่นbound1 <= bound2
หรือbound2 <= bound1
) ฉันพบว่าสิ่งนี้มีประโยชน์สำหรับการจับค่าที่คำนวณจากสมการเชิงเส้น ( y=mx+b
) ซึ่งความชันของเส้นสามารถเพิ่มหรือลดได้
ฉันรู้: รหัสประกอบด้วยห้าซุปเปอร์น่าเกลียดผู้ประกอบการนิพจน์เงื่อนไข สิ่งนี้คือใช้งานได้และการทดสอบด้านล่างพิสูจน์ได้ อย่าลังเลที่จะเพิ่มวงเล็บที่ไม่จำเป็นอย่างเคร่งครัดหากคุณต้องการ
คุณสามารถสร้างโอเวอร์โหลดอื่น ๆ สำหรับตัวเลขประเภทอื่น ๆ ได้อย่างง่ายดายและคัดลอก / วางการทดสอบ
คำเตือน: การเปรียบเทียบตัวเลขทศนิยมไม่ใช่เรื่องง่าย รหัสนี้ไม่ได้ใช้การdouble
เปรียบเทียบอย่างมีประสิทธิภาพ ใช้ไลบรารีการเปรียบเทียบจุดลอยตัวเพื่อแทนที่การใช้ตัวดำเนินการเปรียบเทียบ
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:
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);
}
}