从字符串中删除最后三个字符。

175

我想从一个字符串中删除最后三个字符:

string myString = "abcdxxx"; 

请注意该字符串是动态数据。

16个回答

324
您可以使用 string.Substring,并给出起始索引,它将获取从给定索引开始到末尾的子字符串。
myString.Substring(myString.Length-3)

从这个实例中检索一个子字符串。子字符串从指定的字符位置开始。MSDN 编辑,更新后的帖子
从字符串中删除最后3个字符[更新问题]
要从字符串中删除最后三个字符,您可以使用string.Substring(Int32, Int32)并给它起始索引0和结束索引小于字符串长度三个字符。它将获取最后三个字符之前的子字符串。
myString = myString.Substring(0, myString.Length-3);

String.Substring 方法 (Int32, Int32)

从此实例检索子字符串。子字符串从指定的字符位置开始,并具有指定的长度。

您还可以使用 String.Remove(Int32) 方法,通过将起始索引设置为 length - 3 来删除最后三个字符,它将从该点开始一直删除到字符串结尾。

myString = myString.Remove(myString.Length-3)

String.Remove方法(Int32)

返回一个新字符串,其中当前实例中从指定位置开始并继续到最后位置的所有字符都已被删除


17
这绝对不是答案。 - braks
26
谢谢@braks的帮助,最初问题是“从字符串中读取最后3个字符”,后来进行了编辑,我不知道,请查看问题的编辑历史记录。您的评论帮助我纠正了我的答案,在问题编辑后出现了错误。 - Adil
5
在C#8+中,您可以使用myString[..^3]完成此操作。 - Granger
@Granger,需要注意的是,在Framework 4.x上,C#9中这是无用的。 - WLFree
@WLFree - 范围运算符是一种_语言_特性,而不是_框架_特性。 - Granger
@Granger 我承认我之前的说法有误,同时需要指出的是,即使在.csproj文件中将LangVersion设置为“latest”,.NET Framework 4.8最多只支持C# 7.3。 - WLFree

30
myString = myString.Remove(myString.Length - 3, 3);

1
String.Remove的文档令人困惑。首句是:“返回一个新字符串,其中删除了当前字符串中指定数量的字符。”这让人们一开始认为string.Remove(3)可以解决问题(或者可能从字符串开头删除三个字符),但是在阅读重载描述后,人们意识到它并不能实现。 - Stewart

20
我阅读了所有这些内容,但想要更加优雅的解决方案。只需从字符串末尾删除一定数量的字符:
string.Concat("hello".Reverse().Skip(3).Reverse());

输出:

"he"

11
这个方案相当“有创意”,因为它不需要字符串长度,但是反向操作可能会更加耗费资源。 - Aleksandar
4
颠倒一个字符串的成本肯定比计算其字符数更高。需要构建一个完全新的字符串,然后将原字符串复制到其中,最后需要进行垃圾回收处理。 - Matt Gregory
1
@MattGregory 这甚至不是在"计算"字符串的字符数,字符串已经存储了它的Length - Wolfzoon
2
现在我们也有了.SkipLast(n)。不需要反转任何内容。"hello".SkipLast(3)会得到"he" - Ajit Panigrahi
太棒了!我想要一个好看的单行版本。由于这一部分对节点性能至关重要,我认为这个解决方案是最佳选择。 - Richard Lalancette
显示剩余2条评论

19

新的C# 8.0范围运算符可以成为一个很好的快捷方式来实现这一点。

示例1(回答问题):

使用新的C# 8.0范围运算符可以轻松解决此问题。

示例1(回答问题):

string myString = "abcdxxx";
var shortenedString = myString[0..^3]
System.Console.WriteLine(shortenedString);
// Results: abcd

示例 #2(展示范围运算符的强大之处):

string s = "FooBar99";
// If the last 2 characters of the string are 99 then change to 98
s = s[^2..] == "99" ? s[0..^2] + "98" : s;
System.Console.WriteLine(s);
// Results: FooBar98

2
范围操作符非常强大。 - Arvo Bowen
1
他们很厉害。我建议谨慎使用它们...有时候过于聪明反而会使代码难以阅读。但是它们是简洁并获得所需的杰出方式。 - vullnetyy
1
我不知道你在说什么,我的方法中这32个嵌套的范围运算符看起来像一盘美丽的意大利面。 - Arvo Bowen
哈哈哈哈!不,它并不那么糟糕。我们可以更进一步。我只是提醒任何阅读此内容并过度受到启发的人要谨慎。 :) - vullnetyy
1
我同意 @vullnetyy 的观点 - 这些快捷方式确实很酷,但是例如使用范围运算符而不是 SubString 或 Remove 会使代码的可读性大大降低。 - Edwardo

13
myString.Remove(myString.Length-3);

4
myString = myString.Remove(myString.Length - 3) 这行代码的意思是删除字符串myString末尾的三个字符。 - A-Sharabiani

8

如果你在使用C# 8或更高版本,你可以使用“ranges”:

string myString = "abcdxxx";
string trimmed = myString[..^3]; // "abcd"

更多示例:

    string test = "0123456789", s;
    char c;
    c = test[^3]; // '7'
    s = test[0..^3]; // "0123456"
    s = test[..^3]; // "0123456"
    s = test[2..^3]; // "23456"
    s = test[2..7]; // "23456"
    //c = test[^12]; // IndexOutOfRangeException
    //s = test[8..^3]; // ArgumentOutOfRangeException
    s = test[7..^3]; // string.Empty

8
string test = "abcdxxx";
test = test.Remove(test.Length - 3);
//output : abcd

6
您可以使用 String.Remove 方法来删除从指定位置到字符串结尾的内容。
myString = myString.Remove(myString.Length - 3);

6

由于您提到它是“动态数据”,所以这可能不是完全符合您要求的,但考虑到您的示例字符串,以下代码也可以起作用:

? "abcdxxx".TrimEnd('x');
"abc"

3

很简单。 text = text.remove(text.length - 3)。 我减去了3,因为Remove函数从那个索引开始删除到字符串的末尾,即text.length。因此,如果我减去3,就可以得到删除了3个字符的字符串。

您可以将其推广到从字符串末尾删除a个字符,如下所示:


text = text.remove(text.length - a) 

我所做的与原答案相同。函数remove会将其内部到字符串末尾的所有项删除,即文本长度。因此,如果我从字符串长度中减去a,就可以得到已删除a个字符的字符串。
这不仅适用于3,而是适用于所有正整数,但如果字符串长度小于或等于a,则会返回负数或0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接