基于布尔值对数值求反的优雅方式
本文关键字:方式 于布尔 | 更新日期: 2023-09-27 18:04:05
我有一个十进制变量,如果布尔变量为true,我想将其取反。有人能想到比这更优雅的方法吗:
decimal amount = 500m;
bool negate = true;
amount *= (negate ? -1 : 1);
我在想一些类似于逐位运算符或严格数学实现的东西。
就我个人而言,我只会使用if语句,因为我觉得它在意图方面是最清楚的:
decimal amount = 500m;
bool negate = true;
// ...
if (negate)
amount *= -1;
这真的不是任何额外的打字(实际上更短!(,在我看来更清晰。
使用十进制一元否定运算符(就像您已经在做的那样(:
using System;
class Program
{
static void Main()
{
bool negate = true;
decimal test = 500M;
Console.WriteLine(negate == true ? -test : test);
}
}
输出:
-500
坦率地说,这比用那种奇怪的方式乘以-1要清楚得多,也要好得多。
数学向导的另一个镜头?
如何调整您现有的解决方案,使其可读性略高,但仍能使用该语句?真:假捷径?
您的解决方案是:
amount *= (negate ? -1 : 1);
也许可以将其重构为
amount = (negate ? amount*-1 : amount);
为了给你的代码增加更多的可读性,你可以制作一个可重用的类来处理这类东西:
public static class MathHelpers()
{
// Negates the result if shouldNegate is true, otherwise returns the same result
public static decimal Negate(decimal value, bool shouldNegate)
{
// In this black-box solution you can use "fancier" shortcuts
return value *= negate ? -1 : 1;
}
}
在您的其他代码中,您现在可以使用一个可读性很强的函数。。。
decimal amount = 500m;
bool negate = true;
amount = MathHelper.Negate(amount, negate);
总而言之,尽管我同意优雅和可读性存在于同一个推车中,而不是不同的推车中:
if (condition)
output *= -1;
比更可读
value *= condition ? -1 : 1;
public static decimal Negate(this decimal value, bool isNegate){
if(isNegate) return value * -1;
return value;
}
使扩展方法为十进制。易于使用。
调用类似amount.Negate(negate)
这已经存在,因为Framework 1.1:
System.Decimal.Negate方法
公共静态十进制否定(十进制d)
示例用法:
decimal amount = 500m;
bool negate = true;
if(negate)
amount = decimal.Negate(amount);
// amount now holds -500
// Use amount
如果你的negate
标志是基于某个数值的,你可以使用Math.Sign
,这是我能想到的最"数学"的方法。
double negationValue = -45.0;
amount *= Math.Sign(negationValue);
或者在布尔值的情况下只是(不是很优雅(:
amount *= Math.Sign(0.5 - Convert.ToByte(negate));
amount *= Math.Pow(-1, Convert.ToInt32(negate))
这是基于这样的假设,即在C#中对布尔值进行类型转换将在false时产生0,在true时产生1。然而,我认为这并不优雅,因为这是一种混淆。
edit:转换为int