【问题标题】:Convert If statement using Pattern matching使用模式匹配转换 If 语句
【发布时间】:2021-05-19 10:01:12
【问题描述】:

如何在 switch 表达式中使用模式匹配转换以下 If 语句?

if (Math.Round(self, decimals) - Math.Round(value, decimals) < 0)
   return -1;
else if (Math.Round(self, decimals) - Math.Round(value, decimals) == 0)
   return 0;
else
   return 1;

【问题讨论】:

  • 这不是关于如何使用 Visual Studio 的问题。请注意不要滥用标签。请注意,大多数都有您可以阅读的说明,以确保您将其用于预期目的。

标签: c#


【解决方案1】:

虽然您可以为此使用 switch 表达式(请参阅@Klamsi 的回答),但有更好的方法:

return Math.Round(self, decimals).CompareTo(Math.Round(value, decimals));

来自the docs

返回

Int32

一个有符号数,表示此实例和值的相对值。

Return Value Description
Less than zero This instance is less than value, or this instance is not a number (NaN) and value is a number.
Zero This instance is equal to value, or both this instance and value are not a number (NaN), PositiveInfinity, or NegativeInfinity.
Greater than zero This instance is greater than value, or this instance is a number and value is not a number (NaN).

(虽然文档说返回值可以是任何值,但实际上所有 BCL 类型都返回 -1、0 或 1)。

【讨论】:

  • 这也比我的建议好! :D
  • 肯定从您引用的内容来看,您的返回值不能保证相同?这可能并不重要,但是 OP 返回 1 你的方法(据我所知)可以返回任何正整数)......(我会注意到,即使当前的实现确实返回 1,0,-1 规范没有' t似乎保证)
  • @Chris 确实如此,但是 BCL 中 CompareTo 的每个实现都返回 -1、0 或 1。人们现在无疑会依赖它,所以这不是他们可以改变的东西
  • 这很公平。老实说,我很惊讶他们不只是将其记录下来以使其更清晰。我想知道是否某些实现可能会使用减法技巧,但一个快速的谷歌告诉我为什么这是一个糟糕的想法(在stackoverflow.com/questions/29343128/… 的答案中涵盖)。无论如何,我认为它在实践中总是返回 1,0,-1 值得一提(即使只是在我们拥有的 cmets 中)。
【解决方案2】:
return Math.Round(self, decimals) - Math.Round(value, decimals) switch
{
    < 0 => -1,
    0 => 0,
    _ => 1
};

虽然这是在这种特殊情况下您的问题的答案,但有更好的解决方案,请参阅其他答案

【讨论】:

  • 这正是我一直在寻找的......但我意识到有更好的解决方案。谢谢!
【解决方案3】:

你可以用这个替换你的整个代码:

return Math.Sign(Math.Round(self, decimals) - Math.Round(value, decimals));

Math.Sign(value) documentation:

表示数值符号的数字,如下表所示。

Return Value Meaning
-1 value is less than zero.
0 value is equal to zero.
1 value is greater than zero.

我建议canton7's answer 可能是这里的最佳选择。

【讨论】:

    【解决方案4】:

    一种方式如下:

    var result = (Math.Round(self, decimals) - Math.Round(value, decimals)) switch
    {
        < 0 => -1,
        0 => 0,
        _ => 1                  
    };
    

    现场示例:https://dotnetfiddle.net/ly18qu

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多