नीचे दिया गया कोड किसी भी क्रम में सीमा निर्दिष्ट करने का समर्थन करता है (यानी 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 / फ्लुएंटसॉर्शन परीक्षण:
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);
}
}