反转switch语句

时间:2015-01-23 15:45:15

标签: c#

我正在研究一些继承的代码,我有一个功能,即在挥杆重量的格式之间进行转换(高尔夫俱乐部术语,非高尔夫球手)。该函数在字母/浮点格式(例如,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
    }

1 个答案:

答案 0 :(得分:2)

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

由于含糊不清,最好的办法是简单地对结果 / 字母进行计算,从而获得A__结果,B__结果, C__结果......等等。由于你必须在第一次应用数学时执行一些if检查,你甚至可能需要每个字母不止一个这样的结果,但是然后开始查找与假设不匹配的结果 - 这是{的结果{1}}如果该阶段数学(A)的反向大于10,则lWS_sum < 10可以被删除。

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