StringBuilder.Remove() 函数意外工作

Tom*_*009 0 .net c#

我正在创建一个接受字符串的短代码,并将其输出为格式化的电话号码。

代码如下所示:

    public static void Main()
{
    {
        StringBuilder phoneNumber = new StringBuilder("(559) 440-9safa071",20);

        string enteredPhoneNumber = "(559) 440-9safa071";
        for (int i = 0; i < phoneNumber.Length-1; i++)
        {
            Console.WriteLine("Testing: " + phoneNumber[i]);
            if (phoneNumber[i] == ' ' || Char.IsWhiteSpace(phoneNumber[i]))
            {
                phoneNumber.Remove(i, 1);
            }
            else if (char.IsNumber(phoneNumber[i]) == false)
            {
                phoneNumber.Remove(i, 1);
            }
        }
        Console.WriteLine("Entered Phone Number:" + enteredPhoneNumber + "\n " + phoneNumber);

    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法删除 559 和 440 之间的空格,并且某些字母似乎被删除而其他字母则没有。

这是输出:

Testing: (
Testing: 5
Testing: 9
Testing: )
Testing: 4
Testing: 4
Testing: 0
Testing: -
Testing: s
Testing: f
Testing: 0
Testing: 7
Entered Phone Number:(559) 440-9071
 559 4409aa071
Run Code Online (Sandbox Code Playgroud)

我花了大约一个小时试图修补、更改关键字,甚至尝试使用在线编译器来检查我的 Visual Studio 是否正常运行,但我找不到解决方案。

Tho*_*ler 5

StringBuilder 的内容在您处理它时会被修改。

也就是说,如果您删除一个字符并执行i++,它将跳过一个字符。

有几种选择,其中许多很难阅读。即时解决方案:i++在 for 循环中删除,仅在不删除字符时增加,如下所示:

for (int i = 0; i < phoneNumber.Length-1;)         // <-- removed i++
{
    Console.WriteLine("Testing: " + phoneNumber[i]);
    if (phoneNumber[i] == ' ' || Char.IsWhiteSpace(phoneNumber[i]))
    {
        phoneNumber.Remove(i, 1);
    }
    else if (char.IsNumber(phoneNumber[i]) == false)
    {
        phoneNumber.Remove(i, 1);
    }
    else
    {
        i++;                                     // <-- added i++
    }
}
Run Code Online (Sandbox Code Playgroud)

一种更具可读性的方法是将结果存储在一个新变量中:

string result = "";
for (int i = 0; i < phoneNumber.Length-1;i++)
{
    Console.WriteLine("Testing: " + phoneNumber[i]);
    if (phoneNumber[i] != ' ' &&
        !Char.IsWhiteSpace(phoneNumber[i]) &&
        char.IsNumber(phoneNumber[i]))
    {
        result += phoneNumber[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

这揭示了条件的明显优化:

string result = "";
for (int i = 0; i < phoneNumber.Length-1;i++)
{
    Console.WriteLine("Testing: " + phoneNumber[i]);
    if (char.IsNumber(phoneNumber[i]))
    {
        result += phoneNumber[i];
    }
}
Run Code Online (Sandbox Code Playgroud)