首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中StringToInt函数的最佳解决方案

C#中StringToInt函数的最佳解决方案
EN

Stack Overflow用户
提问于 2010-05-31 20:27:02
回答 7查看 531关注 0票数 4

在上周的一次工作面试中,我被要求在白板上做一个StringToInt / Int.parse功能,表现不是很好,但我想出了一些解决方案。后来回到家,我在Visual Studion上做了一个,我想知道是否有比我下面的更好的解决方案。

除了检查字符串是否只包含数字之外,不再进行任何错误处理。

代码语言:javascript
复制
        private int StrToInt(string tmpString)
    {
        int tmpResult = 0;

        System.Text.Encoding ascii = System.Text.Encoding.ASCII;
        byte[] tmpByte = ascii.GetBytes(tmpString);

        for (int i = 0; i <= tmpString.Length-1; i++)
        {
            // Check whatever the Character is an valid digit
            if (tmpByte[i] > 47 && tmpByte[i] <= 58)
                // Here I'm using the lenght-1 of the string to set the power and multiply this to the value
                tmpResult += (tmpByte[i] - 48) * ((int)Math.Pow(10, (tmpString.Length-i)-1));
            else
                throw new Exception("Non valid character in string");

        } 

        return tmpResult;
    }
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-05-31 20:32:08

我认为您的解决方案还不错,但我不会使用math.pow,而是:

代码语言:javascript
复制
tmpResult = 10 * tmpResult + (tmpByte[i] - 48);

另外,根据tmpByte而不是tmpString的长度检查长度。这通常并不重要,但在循环一个数组的同时检查另一个数组的长度是相当奇怪的。

而且,您可以用foreach语句替换for循环。

票数 5
EN

Stack Overflow用户

发布于 2010-05-31 21:08:02

我将采取一种相反的方法。

代码语言:javascript
复制
public int? ToInt(this string mightBeInt)
{
    int convertedInt;
    if (int.TryParse(mightBeInt, out convertedInt))
    {
        return convertedInt;
    }
    return null;
}

在被告知这不是问题的重点之后,我认为这个问题测试的是C编程技能,而不是C#。我进一步认为,在.NET中,将字符串视为字符数组是一个非常不好的习惯,因为字符串是unicode,并且在任何可能全球化的应用程序中,对字符表示进行任何假设迟早会给您带来麻烦。此外,该框架已经提供了一种转换方法,它将比开发人员匆忙抛出的任何东西更有效和可靠。重新发明框架功能总是一个不好的主意。

然后我会指出,通过编写一个扩展方法,我已经为string类创建了一个非常有用的扩展,这是我在生产代码中实际使用的东西。

如果这个论点让我丢掉了工作,我可能无论如何都不想在那里工作了。

编辑:正如一些人指出的那样,我错过了TryParse中的" out“关键字。已修复。

票数 16
EN

Stack Overflow用户

发布于 2010-05-31 20:33:19

没有必要转换为字节数组,因为字符串已经是一个char数组了。另外,应该避免使用像48这样的幻数,而应该使用像'0'这样的可读常量。我是这样做的:

代码语言:javascript
复制
int result = 0;
for (int i = str.Length - 1, factor = 1; i >= 0; i--, factor *= 10)
    result += (str[i] - '0') * factor;

对于每个字符(从末尾开始),将其数值乘以正确的10次方得到结果。10的幂是通过重复将其与10相乘来计算的,而不是不必要地使用Math.Pow

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2943499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档