无法弄清楚为什么这不起作用。
我正在尝试分析包含“。”的可变长度字符串。在里面的某个地方,然后剥去“。”和之前的所有人物。这是通过Web服务调用的。
调试时,它可以正常工作,直到它在下面的最后一行,使用浏览器消息: “System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。 参数名称:长度 “
有人有任何想法吗?
下面的Code1是从eform传递给Web服务的输入变量。
Dim CharNo As New Integer
CharNo = Code1.IndexOf(".")
MyCodebookValueStrip.o_Code1 = Code1.Substring(CharNo + 1, (Code1.Length - CharNo))
答案 0 :(得分:5)
您计算剩余字符串的长度是不正确的。你必须再减一次:
Code1.Substring(CharNo + 1, Code1.Length - CharNo - 1)
您也可以省略第二个参数,它将获得字符串的其余部分:
Code1.Substring(CharNo + 1)
答案 1 :(得分:1)
也许你可以尝试另一种非常简单的方法?
MyCodebookValueStrip.o_Code1 = Code1.Split(".").Last()
如果您完全确定字符串确实包含句点。否则,请使用:
MyCodebookValueStrip.o_Code1 = Code1.Split(".").LastOrDefault()
如果您的字符串不包含句点,则会返回'Nothing'。
如果你的字符串包含多个句点,你将在字符串中的最后一个句点之后获得子字符串。但你确实有其他的做法,例如:
"StringOne.StringTwo.StringThree".Split(".").First()
会给你“StringOne”。
"StringOne.StringTwo.StringThree".Split(".").Last()
会给你“StringThree”。
"StringOne.StringTwo.StringThree".Split(".").Skip(1).Take(1)
会给你“StringTwo”。
您需要引用并导入System.Linq才能使用这些东西,这意味着您需要使用.NET 3.5或更高版本。
答案 2 :(得分:0)
Dim output As String
Dim Code1 As String = "test.txt"
Dim charNo As Integer = Code1.IndexOf('.')
If ((charNo <> -1) And (Code1.Length <> charNo + 1)) Then
output = Code1.Substring(charNo, Code1.Length - charNo)
Else
output = ""
End If
以上对我来说完美无缺..可能是你从IndexOf方法获得-1位置?
答案 3 :(得分:0)
问题是你要在起始索引(CharNo + 1
)中添加一个,但是你不会从长度减去一个。要纠正它,你应该写:
Code1.Substring(CharNo + 1, (Code1.Length - CharNo - 1))
然而,这是不必要的,因为你真正需要做的就是:
Code1.Substring(CharNo + 1)
另外,您应该检查CharNo + 1
是否小于长度,以防句点是文本中的最后一个字符:
If CharNo + 1 < Code1.Length Then
MyCodebookValueStrip.o_Code1 = Code1.Substring(CharNo + 1)
Else
MyCodebookValueStrip.o_Code1 = ""
End If
但是,如果您要获取的是文件名的扩展名,那么您应该使用Path
类来正确执行(并且更容易):
MyCodebookValueStrip.o_Code1 = Path.GetExtension(Code1)
答案 4 :(得分:0)
不应该是:
Code1.Substring(CharNo + 1, (Code1.Length - CharNo - 1))
因为Code1.Length - CharNo
为您提供了额外的字符。
例如:
"abc.abcd"
您想要最后4个字符,length - charNo
将产生5.因此错误。
答案 5 :(得分:0)
谢谢大家。我应该意识到它需要-1。 这里有很多正确的答案,我不确定我是否可以选择多个作为“接受的答案”。我试试看。 非常感谢。