【问题标题】:Issue with Removing characters from a string从字符串中删除字符的问题
【发布时间】:2014-03-20 03:28:24
【问题描述】:

我已经看到很多关于如何使用 c# 处理字符串中的编辑字符的答案。

但是,我需要一个只考虑使用字符串类方法 remove 的回复(也是为了避免使用 stringbuilder)。

这只是为了让我可以看到这个特定代码的问题所在,它似乎没有消除电话号码中的中间空格。该代码还会删除任何其他不是数字的字符。

到目前为止,我一直无法理解为什么不会删除空格或两个相邻的空格。我怀疑对同一字符串的自分配可能是一个问题,但我不确定。

//leave only the digits
for (int i = 0; i < enteredPhone.Length; i++)
{
     switch (enteredPhone[i])
     {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
           break;

        default:
             //gets rid of any other type of character
             enterPhone = enteredPhone.Remove(i, 1);
             break;
        }
   }

提前致谢。

【问题讨论】:

  • “但是,我需要一个只考虑使用字符串类方法 remove 的回复(也避免使用 stringbuilder)。”您需要解释此要求。对于可能会帮助你的人来说,这没有意义。
  • 天啊,如果你不打算使用基类库提供的优势,你为什么要使用 C# 和 .Net?继续编程with butterflies
  • 当您像上面一样删除时,您会更改索引i 值。你需要为此做出调整。
  • 这可能是一个有用的练习,可以通过不断变化的项目数迭代容器

标签: c# string methods


【解决方案1】:

删除字符时尝试减 1。因为如果去掉位置 5 和 i++ 的字符,现在 i 的值为 5,循环将找不到下一个字符。像这样:

default:
         //gets rid of any other type of character
         enterPhone = enteredPhone.Remove(i, 1);
         i--;
         break;

【讨论】:

  • enterPhone 应该是enteredPhone(赋值),否则循环会卡住。
【解决方案2】:

您的问题是每次都增加索引,即使您已经删除了非数字字符。在这种情况下,下一个字符将具有当前索引,但在下一个循环中,您正在增加当前索引,从而跳过下一个字符。使用while 而不是for

int index = 0;
while(index < enteredPhone.Length)
{
    switch (enteredPhone[index])
    {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            index++;
            break;

        default:                
            enteredPhone = enteredPhone.Remove(index, 1);
            break;
    }
}

你也可以使用 Char.IsDigit 来简化这个循环:

int index = 0;
while(index < enteredPhone.Length)
{
    if (Char.IsDigit(enteredPhone[index]))
    {
        index++;
        continue;
    }

    enteredPhone = enteredPhone.Remove(index, 1);
}

【讨论】:

    【解决方案3】:

    忽略你奇怪的要求:

    Regex.Replace(inputString, @"\D", string.Empty)
    

    【讨论】:

    • 顺便说一句,\D[^\d] 相同。
    • @Andy:意料之中......可能是因为我拒绝接受原始问题的要求。
    【解决方案4】:

    “为什么不会删除空格或两个相邻的空格” - 因为当您 .Remove i 时,i 之后的所有字符索引都减 1。

    向后移动字符串 - 从Length-10

    【讨论】:

      【解决方案5】:
      var onlyDigits = new string(enteredPhone.Where(Char.IsDigit).ToArray());
      

      应该比正则表达式更高效。

      【讨论】:

      • 为什么说它应该比正则表达式更高效?
      • @wdosanjos 正则表达式通常是一种非常昂贵的做事方式。我做了一个快速基准测试,上面的正则表达式答案比这个答案长 9-10 倍。
      • @wdosanjos 如果更改正则表达式答案以优化正则表达式的创建方式,我能够将其速度降低到此答案的 6 倍。
      • 正则表达式对于复杂的解析来说速度很快,但对于像这样的简单操作来说过大了
      【解决方案6】:

      你也可以试试。但我相信 Linq 或 Regex 解决方案是更好的选择。

      //leave only the digits
      for (int i = enteredPhone.Length - 1; i >= 0; i--)
      {
          if (!Char.IsDigit(enteredPhone[i]))
          {
             enterPhone = enteredPhone.Remove(i, 1);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 2016-07-26
        • 2013-09-18
        • 2011-11-22
        相关资源
        最近更新 更多