5

删除尾随部分是我使用代码

str.substring(0,str.length -2) 

有没有更好的办法?我特别不喜欢使用 str.length。

编辑 我希望问题尽可能简短和简单,我认为我只是忽略了一些 String 方法。我试着更精确。

我需要从字符串末尾删除给定数量的字符。我不想关心字符是什么,也不想引入删除更多字符的风险。

如果数字大于字符串长度,那么我们就会有一个异常(应该更早地验证字符串)。

我没有特别是长度的问题,但是两次引用一个变量(想象一个函数而不是一个变量)。我也不喜欢减法的必要性,但这只是个人喜好。

VB.NET 解决方案

这个问题被标记为 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
4

5 回答 5

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 中,子字符串在线性时间内完成(例如,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 截断方法应该尽可能快。

于 2012-06-12T15:33:08.687 回答
5

看看这个相关的问题:

从 .NET 中的字符串末尾修剪字符串 - 为什么会丢失?

由于没有内置方法来执行此操作,因此您需要创建自己的方法(最好是扩展方法):

public static string RemoveCharsFromEnd(this string input, int charactersToRemove) 
{
    if (input.Length > charactersToRemove) 
        return input.substring(0, input.Length - charactersToRemove);
    else
        return "";
}
于 2012-06-12T15:13:25.430 回答
3

所以确实存在一种方法可以在2不使用的情况下删除字符串的第一个字符str.Length,即

str.Substring(2)

因此你问如何从另一端做到这一点?我不认为该框架提供了这一点。您可以使用

str.Remove(str.Length - 2)

但这使用Length.

这是一种使用 Linq 并且性能不佳的丑陋方式:

new string(str.Reverse().Skip(2).Reverse().ToArray())

当字符串太短时,丑陋的想法不会引发异常。

于 2012-06-12T15:26:23.137 回答
0

这取决于您所说的“尾随部分”是什么意思。您是指内容后的空格吗?例如:

string test = "This is a test string.   "; // But you want "This is a test string."

你想删除之后的空格吗?这可以通过.Trim()or.TrimEnd()命令实现。如果您不是这个意思,请说明问题所在。

于 2012-06-12T15:02:12.767 回答
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() 函数删除尾随部分

于 2012-06-12T15:03:22.593 回答