有没有更好的方法来删除.NET中的字符串尾部?

时间:2012-06-12 14:59:01

标签: .net vb.net string

为了删除尾随部分,我使用代码

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

5 个答案:

答案 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()函数删除尾随部分