【问题标题】:Reversing a switch statement反转 switch 语句
【发布时间】:2015-01-23 15:45:14
【问题描述】:

我正在处理一些继承的代码,并且我有一个函数可以转换为挥杆重量的格式(高尔夫球杆术语,适合非高尔夫球爱好者)。此函数将字母/浮点格式(例如 C3.1、E4.5 等)转换为十进制格式(例如 20.15)。这不是一种直观的转换,正如您将在下面执行转换的 switch 语句中看到的那样。我的问题是代码只有这种单向转换(从 C8.9 到 20.15),现在我需要反转它(从 20.15 到 C8.9),所以如果解决这个问题对任何人来说都比对我来说,我很想听听你的建议。如果这不是此类问题的正确位置,请告诉我,我会移动它。

    // lorythmicSwingWeight will be in the Letter/Float format, e.g. D3.0
    internal static decimal ioSW(string lorythmicSwingWeight)
    {
        string lSW_alpha = string.Empty;
        decimal lSW_num = 0.0m;
        decimal oSW = 0.0m;

        //parse first letter
        lSW_alpha = lorythmicSwingWeight.Trim().ToUpper().Substring(0, 1);
        //try to parse number
        decimal.TryParse(lorythmicSwingWeight.Substring(1), out lSW_num);

        switch (lSW_alpha)
        {
            case "A":
                if (lSW_num < 10)
                    oSW = (20000m * lSW_num + 1710329m) / 112300m;
                break;
            case "B":
                if (lSW_num < 4.0m)
                    oSW = (500m * lSW_num + 50371m) / 2963m;
                else if (lSW_num < 10)
                    oSW = (250m * lSW_num + 25449m) / 1497m;
                break;
            case "C":
                if (lSW_num < 1.7m)
                    oSW = (4000m * lSW_num + 409927m) / 21980m;
                else if (lSW_num < 5.3m)
                    oSW = (800m * lSW_num + 86909m) / 4660m;
                else if (lSW_num < 10m)
                    oSW = (200m * lSW_num + 21902m) / 1175m;
                break;
            case "D":
                if (lSW_num < 2.2m)
                    oSW = (10000m * lSW_num + 1242163m) / 61100m;
                else if (lSW_num < 5.0m)
                    oSW = (5000m * lSW_num + 621387m) / 30550m;
                else if (lSW_num < 8.5m)
                    oSW = (2000m * lSW_num + 248677m) / 12220m;
                else if (lSW_num < 10m)
                    oSW = (2500m * lSW_num + 310999m) / 15275m;
                break;
            case "E":
                if (lSW_num < 4.0m)
                    oSW = (100m * lSW_num + 13222m) / 601m;
                else if (lSW_num < 10m)
                    oSW = (10000m * lSW_num + 1317201m) / 59900m;
                break;
        }

        oSW = Math.Round(oSW, 2);
        return oSW; // this will spit out a decimal, e.g. 20.15
    }

【问题讨论】:

  • 反向操作甚至是一个函数吗?我的意思是每个特定的十进制格式都会映射​​到一个精确的重量吗?
  • 如果这些应该是 logrythmic,为什么不使用 Math 类来执行实际的 logrythms?
  • @ryanyuyu 我相信这是一对一的,我有一个与之配套的图表。我现在想到,与其想出一个聪明的方法来做到这一点,我可以更多轻松地以某种方式交叉引用图表。
  • @Aravol 这不是 logrythmic,lorythmic 不是错字。
  • @Andy 明白了。如果您交叉引用图表,请注意在比较代码中的非整数值时会有一些非常讨厌的怪癖,您需要进行舍入而不是执行简单的查找

标签: c#


【解决方案1】:

逆向计算的问题在于,至少在数学上,任何给定的输入都可能有两个结果。免责声明:我不是打高尔夫球的人,所以这是从高级逻辑分析中得出的。

由于不明确,最好的办法可能是简单地对结果 per 字母运行计算,从而得到 A__ 结果、B__ 结果、C__ 结果...等等。由于您必须在第一次应用数学时执行一些if 检查,您甚至可能需要每个字母多个这样的结果,但随后开始丢弃与假设不匹配的结果 - 这是A 的结果如果该阶段数学的倒数 (oSW = (20000m * lSW_num + 1710329m) / 112300m;) 大于 10,则 lWS_sum &lt; 10 可能会被淘汰。

从那里,您将获得一个可能的结果列表。按字符串长度排序,取第一个。

【讨论】:

  • 我也不是打高尔夫球的人,但这听起来应该适用于这个应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
相关资源
最近更新 更多