【问题标题】:Simplifying a method?简化方法?
【发布时间】:2018-06-12 21:15:46
【问题描述】:

我最近接手了一个项目作为个人爱好,以挑战提高我的代码质量。我做了这个方法,但我觉得我在某种程度上肯定已经过度工作了,我觉得有一种非常简单的方法可以做到这一点,而不必通过这样的大开关??

我知道 0-9 可能只是 .ToString()'d 然后解析为 int 并返回,但我不确定如何在考虑其余 switch 案例的同时合并该想法。

public static short ParseHeight(char input)
{
    switch (input)
    {
        case '0':
            return 0;
        case '1':
            return 1;
        case '2':
            return 2;
        case '3':
            return 3;
        case '4':
            return 4;
        case '5':
            return 5;
        case '6':
            return 6;
        case '7':
            return 7;
        case '8':
            return 8;
        case '9':
            return 9;
        case 'a':
            return 10;
        case 'b':
            return 11;
        case 'c':
            return 12;
        case 'd':
            return 13;
        case 'e':
            return 14;
        case 'f':
            return 15;
        case 'g':
            return 16;
        case 'h':
            return 17;
        case 'i':
            return 18;
        case 'j':
            return 19;
        case 'k':
            return 20;
        case 'l':
            return 21;
        case 'm':
            return 22;
        case 'n':
            return 23;
        case 'o':
            return 24;
        case 'p':
            return 25;
        case 'q':
            return 26;
        case 'r':
            return 27;
        case 's':
            return 28;
        case 't':
            return 29;
        case 'u':
            return 30;
        case 'v':
            return 31;
        case 'w':
            return 32;
        default:
            throw new FormatException("The input was not in a correct format: input must be between (0-k)");
    }
}

【问题讨论】:

  • 我投票结束这个问题,因为我相信它属于Code Review
  • 单行:返回 "0123456789abcdefghijklmnopqrstuvwxyz".IndexOf(character);
  • 没有理由在char 上调用ToString() 并解析结果,因为您可以从char 值中减去0 的基值。见标记重复。同样,可以通过减去适当的基值并添加适当的偏移量来处理所有其他字母范围(例如,(ch - 'a') + 10 用于 ch >= 'a' && ch <= 'z' 的值)
  • 我确实觉得很有趣,抛出的异常会告诉调用者他们必须提供一个介于0k 之间的值(没有具体说明其他字符是否像!%A 等可能介于这些值之间的值是合法的),但该方法显然可以处理高达 w 的字母字符。
  • 有些遗憾的是,人们这么快就将一个问题标记为重复,而实际上它并不是您链接到的问题的重复。

标签: c# .net switch-statement


【解决方案1】:

试试这个代码,

public static short ParseHeight(char input)
{
    var res = input - 0;
    if (res <= 57)
        return (short)(res - 48);
    else if (res >= 97)
        return (short)(res - 87);
    else
    {
        throw new FormatException("The input was not in a correct format: input must be between (0-k)");
    }
}

【讨论】:

    【解决方案2】:

    你可以这样做

    var value = "0123456789abcdefghijklmnopqrstuvwxyz".IndexOf(input);
    if (value == -1)
        throw new FormatException("The input was not in a correct format: input must be between (0-k)");
    return value;
    

    【讨论】:

    • 这可能是最好的解决方案(至少在简单的方面)
    • 谢谢,这更简单,绝对有效:)
    【解决方案3】:

    对于字母:

    你可以使用ASCII码

    我们以字母a 为例,根据this table 十六进制代码a61,并且每个字母递增(b 是 62 等等)。你想要10,所以你需要从每个这样的代码中减去51

    您还可以使用该表中字符的十进制表示。 This answer 告诉你如何获取字符的十进制表示

    对于数字

    直接返回。


    我只是建议我将使用的算法。 我想你可以自己实现这个代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-21
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多