【发布时间】:2015-04-14 13:35:29
【问题描述】:
我做了这个简单的测试:
Dim arg1 As String = "TestString1"
Dim arg2 As String = "String1"
Dim result As String = arg1.TrimEnd(arg2.ToCharArray())
现在,结果包含“Tes”而不是预期的“Test”。为什么?
【问题讨论】:
我做了这个简单的测试:
Dim arg1 As String = "TestString1"
Dim arg2 As String = "String1"
Dim result As String = arg1.TrimEnd(arg2.ToCharArray())
现在,结果包含“Tes”而不是预期的“Test”。为什么?
【问题讨论】:
您正在调用TrimEnd,它接受params char[] 作为输入,因此与此相同:
Dim result As String = "TestString1".TrimEnd("S"c,"t"c,"r"c,"i"c,"n"c,"g"c,"1"c)
从字符串末尾删除所有这些字符,包括t。
C#(在这种情况下更具可读性):
string result = "TestString1".TrimEnd('S','t','r','i','n','g','1');
如果您想从第一个字符串的末尾删除整个字符串,请使用IndexOf+Substring:
Dim index As Int32 = arg1.IndexOf("String1")
If index >= 0 Then
Dim result As String = arg1.Substring(0, index) ' Test
End If
【讨论】:
如MSDN article所述:
TrimEnd 方法从当前字符串中删除 trimChars 参数中的所有尾随字符。当在字符串末尾遇到不在 trimChars 中的第一个字符时,修剪操作停止。例如,如果当前字符串是“123abc456xyz789”并且 trimChars 包含从“1”到“9”的数字,则 TrimEnd 方法返回“123abc456xyz”。
由于字母“t”是您告诉它删除的字符之一,它正在这样做。它在到达“s”时停止,因为它不是您要删除的字符之一。
要实现你的目标,你可以这样做:
Dim arg1 As String = "TestString1"
Dim arg2 As String = "String1"
If arg1.EndsWith(arg2) Then
Dim result As String = arg1.Substring(0, arg1.Length - arg2.Length)
End If
【讨论】:
因为它没有与arg2 作为一个整体进行修剪;它遍历arg2 的每个单独字符并分别对其进行修剪:
character: S t r i n g 1
indeces in arg1: 4 (3, 5) 2 3 4 5 6
请注意,t 在arg1、3 和5 中有两个索引。另请注意,所有这些索引都与字符串的末尾是连续的;如果没有与索引 4 ("S"c) 处的字符匹配,则链将被破坏,因此,t 将仅匹配位置 5 处的字符。
所以,如果你把arg 的字符去掉[3-6],剩下的就是[0-2] 的字符:
Tes
【讨论】: