Ars*_*nko 31 .net c# math performance
在C#中,我经常要将整数值限制为一系列值.例如,如果应用程序需要百分比,则用户输入中的整数不得小于零或大于一百.另一个例子:如果有五个网页可以访问Request.Params["p"],我希望值为1到5,而不是0或256或99999.
我常常写一个非常丑陋的代码,如:
page = Math.Max(0, Math.Min(2, page));
Run Code Online (Sandbox Code Playgroud)
甚至是丑陋的:
percentage =
(inputPercentage < 0 || inputPercentage > 100) ?
0 :
inputPercentage;
Run Code Online (Sandbox Code Playgroud)
在.NET Framework中没有更智能的方法来做这些事情吗?
我知道我可以编写一个通用的方法int LimitToRange(int value, int inclusiveMinimum, int inlusiveMaximum)并在每个项目中使用它,但也许框架中已经有一个神奇的方法了?
如果我需要手动执行,那么在第一个示例中执行我正在执行的操作的"最佳"(即,更简单,更快速)的方法是什么?像这样的东西?
public int LimitToRange(int value, int inclusiveMinimum, int inlusiveMaximum)
{
if (value >= inclusiveMinimum)
{
if (value <= inlusiveMaximum)
{
return value;
}
return inlusiveMaximum;
}
return inclusiveMinimum;
}
Run Code Online (Sandbox Code Playgroud)
Tra*_*rap 56
这个操作叫做'Clamp',它通常写成:
public static int Clamp( int value, int min, int max )
{
return (value < min) ? min : (value > max) ? max : value;
}
Run Code Online (Sandbox Code Playgroud)
dtb*_*dtb 27
我看到马克的答案,并通过以下方式提出this:
public static class InputExtensions
{
public static int LimitToRange(
this int value, int inclusiveMinimum, int inclusiveMaximum)
{
if (value < inclusiveMinimum) { return inclusiveMinimum; }
if (value > inclusiveMaximum) { return inclusiveMaximum; }
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
int userInput = ...;
int result = userInput.LimitToRange(1, 5)
Run Code Online (Sandbox Code Playgroud)
请参阅:扩展方法
Mik*_*keP 27
一个更简洁的方法,不仅可以使用整数(取自我自己的共享代码库):
public static T Clamp<T>(T value, T min, T max) where T : IComparable<T>
{
if (value.CompareTo(min) < 0)
return min;
if (value.CompareTo(max) > 0)
return max;
return value;
}
Run Code Online (Sandbox Code Playgroud)
编写LimitToRange函数的另一种方法如下.
public int LimitToRange(int value, int inclusiveMinimum, int inclusiveMaximum)
{
if (value < inclusiveMinimum) { return inclusiveMinimum; }
if (value > inclusiveMaximum) { return inclusiveMaximum; }
return value;
}
Run Code Online (Sandbox Code Playgroud)
我认为这仍然有效,但更容易理解.
我喜欢Guffa的回答,但我很惊讶没有人使用Min/Max发布解决方案.
public int LimitInclusive(int value, int min, int max)
{
return Math.Min(max, Math.Max(value, min));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51360 次 |
| 最近记录: |