【问题标题】:How to dynamically remove the last Char in a String in C#如何在 C# 中动态删除字符串中的最后一个字符
【发布时间】:2020-06-28 11:15:54
【问题描述】:

我正在创建一个控制台应用程序,用户可以在该应用程序上输入火车站并找到火车站。为此,我每次都将Console.ReadKey().Key 附加到一个字符串。

当用户输入不正确的字母时,我希望ConsoleKey.Backspace 删除字符串中的最后一个字符。

    private void SetDepartingFrom()
    {
        String searchQuery = "";
        ConsoleKey keyIn;

        while ((keyIn = readKey(searchQuery)) != ConsoleKey.Enter)
        {
            if (keyIn == ConsoleKey.Backspace)
            {
                searchQuery.TrimEnd(searchQuery[searchQuery.Length - 1]);
            }
            else
            {
                searchQuery += keyIn.ToString();
            }
        }
    }

    private ConsoleKey readKey(String searchQuery)
    {
        Console.Clear();

        Console.WriteLine("Stations Found:");

        if (searchQuery != "")
            App.Stations.FindAll(x => x.GetName().ToUpper().Contains(searchQuery.ToUpper())).ForEach(x => Console.WriteLine(x.GetName()));
        else
            Console.WriteLine("No Stations found...");

        Console.Write("Search: " + searchQuery);

        return Console.ReadKey().Key;
    }

我尝试了以下方法:

if (keyIn == ConsoleKey.Backspace)
    searchQuery.TrimEnd(searchQuery[searchQuery.Length - 1]);

if (keyIn == ConsoleKey.Backspace)
    searchQuery.Remove(searchQuery.Length -1);

if (keyIn == ConsoleKey.Backspace)
    searchQuery[searchQuery.Length -1] = "";

没有一个有效。我知道字符串在 C# 中是不可变的,但是,这是可能的还是有更好的方法来实现这一点?

提前致谢。

【问题讨论】:

  • searchQuery = searchQuery.SubString(0, searchQuery.Length - 1);
  • 使用 StringBuilder()
  • @LegacyCode 谢谢!如果您为此放弃答案,我一定会标记它。这行得通。
  • @rene 真的是 StringBuilder 吗?
  • @LegacyCode 是的,你有这个问题吗?

标签: c# string console immutability


【解决方案1】:

String 是不可变的,因此您必须使用 TrimEnd 返回的值。

searchQuery = searchQuery.TrimEnd(searchQuery[searchQuery.Length - 1]);

在这种情况下,我认为Substring 方法会更合适。

【讨论】:

    【解决方案2】:

    如您所述,字符串是不可变的。 string 类型上的所有实例方法(至少与“修改”它相关的那些方法)都返回一个新字符串。这意味着调用类似以下的内容会返回一个新字符串,该字符串会立即被丢弃:

    // value is discarded
    searchQuery.Substring(0, searchQuery.Length - 1);
    

    解决方案是重新分配具有新值的变量。例如:

    searchQuery = searchQuery.Substring(0, searchQuery.Length - 1);
    

    SharpLab example

    如果您使用的是 C# 8,则可以通过 Index/Range 类使用 范围运算符。这提供了一个更干净的版本:

    // backspace one character
    searchQuery = searchQuery[..^1];
    

    SharpLab example

    我还会注意到TrimEnd 很可能不是你想要的。它一次会修剪多个字符,这不是按退格键 会做的。例如考虑以下内容:

    var str =  "Abcdeee";
    var result = str.TrimEnd('e');
    Console.WriteLine(result); // prints "Abcd" 
    

    SharpLab example

    【讨论】:

      【解决方案3】:

      您用来操作字符串的任何方法都将返回新字符串,因此您需要捕获它。

      string newString = searchQuery.Substring(0, searchQuery.Length -1);

      【讨论】:

        【解决方案4】:

        它会返回一个新的字符串,所以你需要将它分配给这样的字符串。

        string newStr = earchQuery.Remove(searchQuery.Length -1);
        

        或者对于相同的字符串,你可以这样做。

        earchQuery= earchQuery.Remove(searchQuery.Length -1);
        

        您还可以使用TrimEndSubString 方法。

        【讨论】:

          【解决方案5】:

          您可以尝试以下代码示例,该示例从字符串中删除最后一个字符。

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text.RegularExpressions;
          
          namespace Rextester
          {
              public class Program
              {
                  public static void Main(string[] args)
                  {
                                  
                  string founder = "Hell World from Big_Data_Analyst!";  
                  string founderMinus1 = founder.Remove(founder.Length - 1, 1);  
                  Console.WriteLine(founderMinus1);           
                      
                  }
              }
          }
          

          代码中输入的字符串是

          Hell World from Big_Data_Analyst!
          

          输出字符串是

          Hell World from Big_Data_Analyst
          

          如您所见,最后一个字符 ! 正在输出中被删除

          【讨论】:

            猜你喜欢
            • 2013-10-14
            • 2011-04-14
            • 2016-10-11
            • 2011-01-19
            • 1970-01-01
            • 2016-10-04
            • 2010-11-08
            • 2021-12-11
            • 2011-11-18
            相关资源
            最近更新 更多