Đoạn mã dưới đây hỗ trợ chỉ định giới hạn theo bất kỳ thứ tự nào (tức là bound1 <= bound2
hoặc bound2 <= bound1
). Tôi thấy điều này hữu ích cho các giá trị kẹp được tính toán từ phương trình tuyến tính ( y=mx+b
) trong đó độ dốc của đường có thể tăng hoặc giảm.
Tôi biết: Đoạn mã bao gồm năm toán tử biểu thức điều kiện siêu xấu . Vấn đề là, nó hoạt động và các thử nghiệm dưới đây đã chứng minh điều đó. Vui lòng thêm các dấu ngoặc đơn không cần thiết nếu bạn muốn.
Bạn có thể dễ dàng tạo quá tải khác cho các loại số khác và về cơ bản sao chép / dán các bài kiểm tra.
Cảnh báo: So sánh số dấu phẩy động không đơn giản. Mã này không thực hiện double
so sánh một cách mạnh mẽ. Sử dụng thư viện so sánh dấu phẩy động để thay thế việc sử dụng các toán tử so sánh.
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;
}
}
Kiểm tra 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);
}
}