基于布尔值对数值求反的优雅方式

本文关键字:方式 于布尔 | 更新日期: 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

相关文章: