2012-06-12 113 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謝謝。 –

相關問題