2012-06-12 57 views
5

对于消除拖尾部分是我使用的代码有没有更好的方法来删除.NET中的字符串的尾部?

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 
+1

你是什么意思的“尾部”? – dtsg

+3

为了删除字符串的最后x个字符,您必须知道它的长度。如果你只是不喜欢在你的代码中看到这个,那么你可以编写一个扩展方法来隐藏计算。 –

+0

@Duane:我的意思是删除最后的x个字符。 – IvanH

回答

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(); 
    } 

这应该是所有固定的时间,但我需要仔细检查反射器,以确保StringBuilder.Length举止行为,我觉得它的方式确实。虽然它是线性时间,但它对于去除字符将是线性的,这必然会低于原始字符串的长度。显然,折中的是,在StringBuilder超出范围之前,你有更多的内存使用,但如果将它包装在一个完成速度非常快的扩展方法中,这应该不是问题。

编辑:是的,StringBuilder.Length只是返回它跟踪的字符串的String.Length,所以在常量时间内的返回和StringBuilder的截断方法应该尽可能快地合理。

+0

有趣。我认为'StringBulider.Length'是一个只读属性,但我看到你是正确的,它是get/set。如果增加'Length',它会附加很多''\ 0''字符。我想知道你什么时候会想要... –

+0

@JeppeStigNielsen当你准备将一堆东西全部零碎地丢弃到构建器中时,并且不希望事物不断重新分配底层数据结构。你必须使用一个索引变量和其他一些我认为通常太复杂且难以理解的东西来衡量它的价值,但如果性能成为一个重要考虑因素,你可能只需要依靠评论的魔力。 – tmesser

+0

当我问这个问题时,我对美学感兴趣,但是我也很欣赏关于表演的信息。你有一些更好的使用StringBuilder的估计长度吗? – IvanH

0

这取决于你的意思是什么'尾随部分'。你的意思是说内容后有空白吗?例如:

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

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

+0

我需要删除任意字符(不只是空格或指定的字符)。 – IvanH

+0

这并没有回答这个问题,但你确实有资格。不值得投票。 +1甚至让你。 – Paparazzi

+0

谢谢Blam。我想这是回答不清楚/模糊问题的风险。我真的认为这是最可能的问题。 – pyrocumulus

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()函数删除后部分

+0

我需要删除任意字符(不只是空格或指定的字符)。 – IvanH

+0

Trim,TrimStart和TrimEnd具有重载,您可以在其中传递char []并删除任意字符。下面是定义:“在trimChars参数中所有字符出现后保留的字符串将从当前字符串的起始处移除。如果trimChars为null或空数组,则会移除空格字符。 http://msdn.microsoft.com/en-us/library/system.string.trimstart.aspx –

+1

“任意字符”表示他想删除最后两个字符,不管它们是什么。你提出的解决方案将要求他传递一个包含每个可能字符的char [] - 全部65,536个字符。 –

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

+1用于处理整个字符串应该被删除的情况。 – MarkJ

+0

这个答案很好,但接受的答案更精确。我特别欣赏与其他问题的联系(不同的答案),我没有找到。 – IvanH

3

所以确实存在着一个地清除字符串的第一个字符2不使用str.Length,即

str.Substring(2) 

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

str.Remove(str.Length - 2) 

但使用Length

下面是一个使用LINQ和有坏的表现丑陋的方式:当字符串太短

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

丑陋的想法并不抛出异常。

+0

创意被低估了:-) –

+0

它回答了问题+1。我个人不明白为什么这个问题正在被投票,但答案正在被投票。 – Paparazzi

+0

@Blam谢谢。 –

相关问题