为了删除尾随部分,我使用代码
str.substring(0,str.length -2)
有更好的方法吗?我特别不喜欢使用str.length。
修改 我希望问题尽可能短而简单,我想我只是忽略了一些String方法。我试着更精确。
我需要从字符串末尾删除给定数量的字符。我不想关心角色是什么,我不想引入删除更多角色的风险。
如果数字大于那么字符串长度让我们有一个异常(字符串应该在之前验证)。
我没有问题,特别是长度,但引用变量两次(想象一个函数而不是变量)。我也不喜欢减法的必要性,但这只是个人偏好。
VB.NET soution
问题是vb.net,所以有vb.net代码(应该在模块中):
<System.Runtime.CompilerServices.Extension> _
Public Shared Function RemoveFromEnd(stringValue As String, removedCharacters As Integer) As String
Return stringValue.Substring(0, stringValue.Length - removedCharacters)
End Function
答案 0 :(得分:8)
如果您关注的只是您所看到的内容的美学,那么将此功能包含在扩展方法中是微不足道的:
public static string RemoveFromEnd(this string stringValue, int removedCharacters)
{
return stringValue.Substring(0, stringValue.Length - removedCharacters);
}
所以你可以简单地使用
str.RemoveFromEnd(2);
并完成它。
如果您担心使用string.length的性能,因为它在非托管语言中的声誉很慢,请不要这样做。由于.Net中的字符串是不可变的,因此在声明字符串时设置String.Length并且永远不会更改。因此,引用String.Length在常量时间内完成(例如,Big-O(1))并且非常快。相比之下,如果您对性能敏感,则应该关注Substring调用。在.Net中,Substring在线性时间内完成(例如,Big-O(n)),其中n是原始字符串的长度。因此,它是您的代码行中的性能瓶颈。相对于弦的长度,它会变慢。
如果你正在处理很长的字符串,那么吞下它可能不太好。要绕过类似的东西,你可以在扩展方法中使用StringBuilder:
public static string RemoveFromEnd(this string stringValue, int removedCharacters)
{
var newString = new StringBuilder(stringValue);
newString.Length = newString.Length - removedCharacters;
return newString.ToString();
}
这应该是所有常量时间,但我需要仔细检查Reflector以确保StringBuilder.Length的行为与我认为的方式相同。但是,即使它是线性时间,它对于removedCharacters也是线性的,它必然会低于原始字符串的长度。显然,权衡是在StringBuilder超出范围之前你有更多的内存使用,但如果你把它包装在一个非常快的完成的扩展方法中,这应该不是问题。
编辑:是的,StringBuilder.Length只返回它跟踪的字符串的String.Length,因此以常量时间返回,而StringBuilder截断的方法应该尽可能快。
答案 1 :(得分:5)
查看以下相关问题:
Trim string from the end of a string in .NET - why is this missing?
由于没有内置方法来执行此操作,因此您需要创建自己的方法(最好是扩展方法):
public static string RemoveCharsFromEnd(this string input, int charactersToRemove)
{
if (input.Length > charactersToRemove)
return input.substring(0, input.Length - charactersToRemove);
else
return "";
}
答案 2 :(得分:3)
所以确实有一种方法可以在不使用2
的情况下删除字符串的第一个str.Length
字符,即
str.Substring(2)
因此你问另一端如何做到这一点?我不认为框架提供了这个。你可以使用
str.Remove(str.Length - 2)
但是使用Length
。
这是一种使用Linq并且性能不佳的丑陋方式:
new string(str.Reverse().Skip(2).Reverse().ToArray())
当字符串太短时,丑陋的想法不会抛出异常。
答案 3 :(得分:0)
这取决于“尾随部分”的含义。你的意思是内容之后的空白吗?例如:
string test = "This is a test string. "; // But you want "This is a test string."
你要删除之后的空格吗?使用.Trim()
或.TrimEnd()
命令可以实现此目的。如果您不是这个意思,请说明问题所在。
答案 4 :(得分:0)
var test = " test";
// Trim all trailing spaces
test = test.Trim();
// Trim only starting trailing spaces
test = test.TrimStart();
// Trim only ending trailing spaces
test = test.TrimEnd();
var test = "abcTest";
// Trim all trailing abc
var toRemove = new char[3];
toRemove[0] = 'a';
toRemove[1] = 'b';
toRemove[2] = 'c';
test = test.TrimStart(toRemove);
您应该使用Trim()函数删除尾随部分