如何在C#中动态删除字符串中的最后一个字符
How to dynamically remove the last Char in a String in C#
我正在创建一个控制台应用程序,用户可以在其中输入火车站并找到火车站。为此,我每次都将 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] = "";
None 成功了。我知道字符串在 C# 中是不可变的,但是,这是否可能或者是否有更好的方法来实现这一点?
提前致谢。
字符串是不可变的,因此您必须使用 TrimEnd 返回的值。
searchQuery = searchQuery.TrimEnd(searchQuery[searchQuery.Length - 1]);
在这种情况下我认为Substring方法会更合适。
您用来操作字符串的任何方法都会 return 新字符串,因此您需要捕获它。
string newString = searchQuery.Substring(0, searchQuery.Length -1);
它将return一个新的字符串,因此您需要将其分配给这样的字符串。
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
如您所见,输出中的最后一个字符 !
已被删除
如您所述,字符串是不可变的。 string
类型的所有实例方法(至少与“修改”它相关的方法)return 一个新字符串。这意味着调用类似于以下内容的 returns 一个新字符串,它会立即被丢弃:
// value is discarded
searchQuery.Substring(0, searchQuery.Length - 1);
解决方案是重新分配 具有新值的变量。例如:
searchQuery = searchQuery.Substring(0, searchQuery.Length - 1);
如果您使用的是 C# 8,则可以通过 Index
/Range
类 使用 范围运算符 。这提供了一个更简洁的版本:
// backspace one character
searchQuery = searchQuery[..^1];
我还会注意到 TrimEnd
很可能 不是 您想要的。它将一次 trim 多个字符,这不是 单次 按 Backspace 键所能达到的效果。例如考虑以下内容:
var str = "Abcdeee";
var result = str.TrimEnd('e');
Console.WriteLine(result); // prints "Abcd"
我正在创建一个控制台应用程序,用户可以在其中输入火车站并找到火车站。为此,我每次都将 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] = "";
None 成功了。我知道字符串在 C# 中是不可变的,但是,这是否可能或者是否有更好的方法来实现这一点?
提前致谢。
字符串是不可变的,因此您必须使用 TrimEnd 返回的值。
searchQuery = searchQuery.TrimEnd(searchQuery[searchQuery.Length - 1]);
在这种情况下我认为Substring方法会更合适。
您用来操作字符串的任何方法都会 return 新字符串,因此您需要捕获它。
string newString = searchQuery.Substring(0, searchQuery.Length -1);
它将return一个新的字符串,因此您需要将其分配给这样的字符串。
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
如您所见,输出中的最后一个字符 !
已被删除
如您所述,字符串是不可变的。 string
类型的所有实例方法(至少与“修改”它相关的方法)return 一个新字符串。这意味着调用类似于以下内容的 returns 一个新字符串,它会立即被丢弃:
// value is discarded
searchQuery.Substring(0, searchQuery.Length - 1);
解决方案是重新分配 具有新值的变量。例如:
searchQuery = searchQuery.Substring(0, searchQuery.Length - 1);
如果您使用的是 C# 8,则可以通过 Index
/Range
类 使用 范围运算符 。这提供了一个更简洁的版本:
// backspace one character
searchQuery = searchQuery[..^1];
我还会注意到 TrimEnd
很可能 不是 您想要的。它将一次 trim 多个字符,这不是 单次 按 Backspace 键所能达到的效果。例如考虑以下内容:
var str = "Abcdeee";
var result = str.TrimEnd('e');
Console.WriteLine(result); // prints "Abcd"