Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中动态删除字符串中的最后一个字符_C#_String_Console_Immutability - Fatal编程技术网

C# 如何在C中动态删除字符串中的最后一个字符

C# 如何在C中动态删除字符串中的最后一个字符,c#,string,console,immutability,C#,String,Console,Immutability,我正在创建一个控制台应用程序,用户可以在上面键入火车站并查找火车站。为此,每次我都会将Console.ReadKey.Key追加到字符串中 当用户键入错误的字母时,我希望ConsoleKey.Backspace删除字符串中的最后一个字符 private void SetDepartingFrom() { String searchQuery = ""; ConsoleKey keyIn; while ((key

我正在创建一个控制台应用程序,用户可以在上面键入火车站并查找火车站。为此,每次我都会将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] = "";
var str =  "Abcdeee";
var result = str.TrimEnd('e');
Console.WriteLine(result); // prints "Abcd" 
没有一个奏效。我知道字符串在C中是不可变的,但是,这是可能的还是有更好的方法来实现这一点


提前感谢。

字符串是不可变的,因此您必须使用TrimEnd返回的值

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

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

字符串是不可变的,所以您必须使用TrimEnd返回的值

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

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

任何用于操作字符串的方法都将返回新字符串,因此需要捕获该字符串


字符串newString=searchQuery.Substring0,searchQuery.Length-1

用于操作字符串的任何方法都将返回新字符串,因此需要捕获该字符串


字符串newString=searchQuery.Substring0,searchQuery.Length-1

它将返回一个新字符串,因此您需要将其分配给如下字符串

string newStr = earchQuery.Remove(searchQuery.Length -1);
earchQuery= earchQuery.Remove(searchQuery.Length -1);
或者对相同的字符串,您可以这样做

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

您还可以使用TrimEnd和SubString方法。

它将返回一个新字符串,因此您需要将其分配给如下字符串

string newStr = earchQuery.Remove(searchQuery.Length -1);
earchQuery= earchQuery.Remove(searchQuery.Length -1);
或者对相同的字符串,您可以这样做

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

您还可以使用TrimEnd和SubString方法。

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

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

正如你看到的最后一个字符是!正在输出中删除的

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

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

正如你看到的最后一个字符是!将在输出中删除

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

// value is discarded
searchQuery.Substring(0, searchQuery.Length - 1);
解决方案是用新值重新分配变量。例如:

searchQuery = searchQuery.Substring(0, searchQuery.Length - 1);
如果您使用的是C8,则可以通过类使用range运算符。这提供了一个更简洁的版本:

// backspace one character
searchQuery = searchQuery[..^1];
我还要指出,TrimEnd很可能不是您想要的。它将一次修剪多个字符,这不是按一次退格键所能做到的。例如,考虑以下内容:

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] = "";
var str =  "Abcdeee";
var result = str.TrimEnd('e');
Console.WriteLine(result); // prints "Abcd" 

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

// value is discarded
searchQuery.Substring(0, searchQuery.Length - 1);
解决方案是用新值重新分配变量。例如:

searchQuery = searchQuery.Substring(0, searchQuery.Length - 1);
如果您使用的是C8,则可以通过类使用range运算符。这提供了一个更简洁的版本:

// backspace one character
searchQuery = searchQuery[..^1];
我还要指出,TrimEnd很可能不是您想要的。它将一次修剪多个字符,这不是按一次退格键所能做到的。例如,考虑以下内容:

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] = "";
var str =  "Abcdeee";
var result = str.TrimEnd('e');
Console.WriteLine(result); // prints "Abcd" 

searchQuery=searchQuery.SubString0,searchQuery.Length-1;使用StringBuilder@LegacyCode谢谢如果你不回答这个问题,我一定会记下来的。这很有效。@rene真的是StringBuilder吗?@LegacyCode是的,你有问题吗?searchQuery=searchQuery.SubString0,searchQuery.Length-1;使用StringBuilder@LegacyCode谢谢如果你不回答这个问题,我一定会记下来的。这奏效了。@rene真的是一个StringBuilder吗?@LegacyCode是的,你有问题吗?