简体   繁体   中英

How to dynamically remove the last Char in a String in C#

I am creating a console application upon which the user can type in a train station and find the train stations. For this, I am appending the Console.ReadKey().Key to a String each time.

When the user types an incorrect letter, I want the ConsoleKey.Backspace to remove the last Char in the String.

    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;
    }

I have tried the following:

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] = "";

None have worked. I understand Strings are immutable in C#, however, is this possible or is there a better way to achieve this?

Thanks in advance.

String is immutable so you have to use the value returned by TrimEnd.

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

In this case I think Substring method would be more appropriate.

As you noted, strings are immutable. All of the instance methods on the string type (at least those related to "modifying" it) return a new string. This means that calling something like the following returns a new string which is immediately discarded:

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

The solution is to reassign the variable with the new value. For example:

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

SharpLab example

If you are using C# 8 you can make use of the range operator via the Index / Range classes. This provides a bit cleaner version:

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

SharpLab example

I will also note that TrimEnd is most likely not what you want. It will trim more than one character at a time which isn't what a single press of the Backspace key would do. For example consider the following:

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

SharpLab example

Any method you use to manipulate the string will return the new string so you need to capture that.

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

It will return a new string, so you need to assign it to a string like this.

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

Or to same string you can do like this.

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

You can also use TrimEnd and SubString methods.

You may try the following code example which removes the last character from a string.

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);           
            
        }
    }
}

The input string in the code is

Hell World from Big_Data_Analyst!

The output string is

Hell World from Big_Data_Analyst

As you see the last character which is ! is being removed in the output

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM