Is there a better way to remove a trailing part of string in .NET?
要删除结尾部分,我使用代码
1 | str.substring(0,str.length -2) |
有更好的方法吗?我特别不喜欢使用str.length。
编辑
我希望这个问题尽可能短而简单,我以为我只是忽略了一些String方法。我尝试更加精确。
我需要从字符串末尾删除给定数量的字符。我不想关心字符是什么,也不想引入删除更多字符的风险。
如果数字更大,则字符串长度为一个例外(该字符串应更早验证)。
我在长度方面没有问题,但是两次引用一个变量(想象一个函数而不是一个变量)。我也不喜欢减法的必要性,但这只是个人喜好。
VB.NET版本
该问题被标记为vb.net,因此存在vb.net代码(应在模块中):
1 2 3 4 | <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 |
如果您只是在考虑您所看的事物的美学,那么将这种功能package在扩展方法中是很简单的:
1 2 3 4 | public static string RemoveFromEnd(this string stringValue, int removedCharacters) { return stringValue.Substring(0, stringValue.Length - removedCharacters); } |
因此您可以简单地使用
1 | str.RemoveFromEnd(2); |
并完成它。
如果您由于担心string.length在非托管语言中运行缓慢而引起的使用性能担心,请不要这样做。由于.Net中的字符串是不可变的,因此在声明字符串且永不更改时会设置String.Length。因此,对String.Length的引用会在固定时间内完成(例如Big-O(1))并且非常快。相反,如果您对性能敏感,则应该专注于Substring调用。在.Net中,子字符串以线性时间(例如Big-O(n))完成,其中n是原始字符串的长度。因此,这是您的代码行中的性能瓶颈。相对于字符串的长度,它将变慢。
但是,如果您要处理的字符串很长,则吞下该字符串可能并不理想。要解决这样的问题,您可以在扩展方法中使用StringBuilder:
1 2 3 4 5 6 | 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的行为符合我的想法。即使是线性时间,相对于removeCharacters也是线性的,它必须小于原始字符串的长度。显然,需要权衡的是,在StringBuilder超出范围之前,您将使用更多的内存,但是如果将其package在真正快速完成的扩展方法中,这应该不是问题。
编辑:是的,StringBuilder.Length只是返回它一直跟踪的字符串的String.Length,以便在固定时间内返回,并且StringBuilder截断方法应尽可能快。
查看以下相关问题:
.NET中字符串结尾处的修剪字符串-为什么缺少此字符串?
由于没有内置方法可以执行此操作,因此您需要创建自己的方法(最好是扩展方法):
1 2 3 4 5 6 7 | public static string RemoveCharsFromEnd(this string input, int charactersToRemove) { if (input.Length > charactersToRemove) return input.substring(0, input.Length - charactersToRemove); else return""; } |
因此确实存在一种无需使用
1 | str.Substring(2) |
,因此您问从另一端开始怎么做?我认为该框架不提供该功能。您可以使用
1 | str.Remove(str.Length - 2) |
但是使用
这是使用Linq且性能较差的丑陋方式:
1 | new string(str.Reverse().Skip(2).Reverse().ToArray()) |
当字符串太短时,丑陋的主意不会引发异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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()函数删除结尾部分
取决于"尾随部分"的含义。内容后面是空格吗?因此,例如:
1 | string test ="This is a test string. "; // But you want"This is a test string." |
,然后要删除空格吗?使用