一个参数,有时候需要在正常的范围内才可以往下传递处理.比如进度条的值等.
所以需要先检测并处理下. 如下代码:
public static partial class 扩展方法
{
/// <summary>
/// 保证返回数据为范围内的数值.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="待测值">The 待测值.</param>
/// <param name="最小">The 最小.</param>
/// <param name="最大">The 最大.</param>
/// <returns>T.</returns>
public static T 范围限制<T>(T 待测值, T 最小, T 最大) where T : IComparable
{
var 大 = (待测值.CompareTo(最小) > 0) ? 待测值 : 最小;
var 小 = (大.CompareTo(最大) > 0) ? 最大 : 大;
return 小;
}
public static int 范围限制(this int 待测值, int 最小, int 最大)
{
return Math.Min(最大, Math.Max(待测值, 最小));
}
public static double 范围限制(this double 待测值, double 最小, double 最大)
{
return Math.Min(最大, Math.Max(待测值, 最小));
}
}
仅仅使用泛型方法即可处理常见的值类型.
测试方法如下:
[TestClass]
public class 范围限制_test
{
[TestMethod]
public void 范围限制_T_测试()
{
var k = 2.0d.范围限制(1, 3);
Assert.AreEqual(2.0d, k);
k = 2.0d.范围限制(3, 5);
Assert.AreEqual(3.0d, k);
k = 2.范围限制(0, 1);
Assert.AreEqual(1, k);
var k2 = 扩展方法.范围限制<int>(2, 1, 3);
Assert.AreEqual(2, k2);
k2 = 扩展方法.范围限制<int>(2, 3, 5);
Assert.AreEqual(3, k2);
k2 = 扩展方法.范围限制<int>(2, 0, 1);
Assert.AreEqual(1, k2);
var k3 = 扩展方法.范围限制("b", "a", "c");
Assert.AreEqual("b", k3);
k3 = 扩展方法.范围限制("a", "b", "c");
Assert.AreEqual("b", k3);
k3 = 扩展方法.范围限制("d", "b", "c");
Assert.AreEqual("c", k3);
}
}