关于vb.net:是否有更好的方法来删除.NET中字符串的结尾部分?

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"";
}


因此确实存在一种无需使用str.Length即可删除字符串的前2个字符的方法,即

1
str.Substring(2)

,因此您问从另一端开始怎么做?我认为该框架不提供该功能。您可以使用

1
str.Remove(str.Length - 2)

但是使用Length

这是使用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."

,然后要删除空格吗?使用.Trim().TrimEnd()命令可以做到这一点。如果您不是这个意思,请指定问题所在。