2011-04-18 32 views
1

我正在使用TrimEnd從字符串末尾刪除某些字符。起初我以爲這會工作:使用 char的奇怪修剪行爲

Dim strNew As String = "Employees\Sickness Entitlement.rpt" 
    Dim strTrim As String = "Sickness Entitlement.rpt" 
    Console.WriteLine(strNew.TrimEnd(strTrim)) '<- Doesn't work 

但TrimEnd僅適用於字符或單個字符的字符串數組,所以我想這:

Dim strNew As String = "Employees\Sickness Entitlement.rpt" 
    Dim strTrim As String = "Sickness Entitlement.rpt" 

    Dim arrChars As Char() 
    ReDim arrChars(strTrim.Length) 
    For i As Integer = 0 To strTrim.Length - 1 
     arrChars(i) = strTrim.Substring(i, 1) 
    Next 

    Console.WriteLine(strNew.TrimEnd(arrChars)) '<- Employees\ 

,直到我在斜線增加這工作得很好:

Dim strNew As String = "Employees\Sickness Entitlement.rpt" 
    Dim strTrim As String = "\Sickness Entitlement.rpt" 

    Dim arrChars As Char() 
    ReDim arrChars(strTrim.Length) 
    For i As Integer = 0 To strTrim.Length - 1 
     arrChars(i) = strTrim.Substring(i, 1) 
    Next 

    Console.WriteLine(strNew.TrimEnd(arrChars)) '<- Employ 

這就是現在輸出:應用

這是莫名其妙的設計?我覺得很奇怪。我的問題的解決辦法是做類似的事情:

If strNew.EndsWith(strTrim) Then 
     Console.WriteLine(strNew.Substring(0, strNew.LastIndexOf(strTrim))) 
    End If 

這是既簡單又有效,但上面發生了什麼?

+1

作爲一個潛在的死衚衕,如果你這樣做來獲取你的文件所在的目錄,那麼有更簡單(更強大)的方法... – 2011-04-18 09:47:46

+2

你從字符串到char數組的轉換也是非常複雜的。您可以簡單地將Dim char寫爲Char()= strTrim.ToCharArray()'。在這種情況下不重要。 – 2011-04-18 09:54:46

回答

2

TrimEnd將刪除所有給予它的字符,以任意順序發現它們,直到它到達不在列表中的字符。

因此,當\不在您提供的列表中時,修剪停在\處。一旦包含\,剪裁刪除\,然後在字符串的末尾看到'ess' - 'e'和's'都已經在您提供的列表中,因此它們會被修剪。

修剪方法完全不適合您要做的事。如果您正在操作路徑,請使用Path.xxx方法。如果你只是試圖將字符串分割成幾個部分,可以使用Split()或Substring()的某種適當組合,以及任何你需要的來找到分割點。

+0

好吧,現在有道理 - 我的誤解 - 謝謝 – 2011-04-18 09:54:58

2

重新閱讀文檔TrimEnd;你使用的是錯誤的:TrimEnd將刪除任意 char在字符串末尾的數組中,只要它仍然可以找到這樣的字符。

例如:

Dim str = "aaebbabab" 
Console.WriteLine(str.TrimEnd(new Char() { "a"c, "b"c }) 

將輸出aa因爲它消除了所有尾隨a S和b秒。

如果輸入長相酷似你的榜樣,你的最簡單的遞歸是使用Substring

Console.WriteLine(strNew.Substring(0, strNew.Length - strTrim.Length)) 

否則,您可以訴諸正則表達式。