2012-07-13 58 views
0

找不到为什么这不起作用。使用子字符串中的.length(VB.NET)

我想分析一个包含“。”的变长字符串。在里面的某个地方,然后去掉“。”和之前的所有角色。这是通过网络服务调用的。

调试时,它,直到它在最后一行捞出,下面,与浏览器消息正常工作: “System.ArgumentOutOfRangeException:索引和长度必须引用位置在字符串中 参数名:长度 “

任何人有任何想法?

下面的Code1是从eform传递给Web服务的输入变量。

Dim CharNo As New Integer 
CharNo = Code1.IndexOf(".") 
MyCodebookValueStrip.o_Code1 = Code1.Substring(CharNo + 1, (Code1.Length - CharNo)) 

回答

5

你的剩余字符串的宽度对计算不正确。你必须减去一个多:

Code1.Substring(CharNo + 1, Code1.Length - CharNo - 1) 

你也可以省略第二个参数,它会得到的字符串的其余部分:

Code1.Substring(CharNo + 1) 
+0

现货。非常感谢。 – 2012-07-13 14:28:16

1

也许你可以尝试一种替代和非常简单的方法?

MyCodebookValueStrip.o_Code1 = Code1.Split(".").Last() 

如果您确定该字符串确实包含句点。否则,请使用:

MyCodebookValueStrip.o_Code1 = Code1.Split(".").LastOrDefault() 

如果字符串不包含句点,它将返回'没有'。

如果您的字符串包含多个句点,则会在字符串返回的最后一个句点之后获取子字符串。但你确实有其他的空间,例如:

"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或更高版本。

+0

此外,只有当字符串只包含一个句点时,它才能正常工作。 – 2012-07-13 14:16:39

+0

确实,但原来的问题确实指定了一个'。'。我已编辑,以迎合其他情况。 – Holf 2012-07-13 14:20:40

+0

好东西。非常感谢。 – 2012-07-13 14:28:46

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位置?

+0

该操作使用CharNo - 1作为第一个参数,因为该时间段不应该在结果中。 – Guffa 2012-07-13 14:22:12

+0

你忽略了他在'SubString'调用中向'charNo'添加'+ 1'的事实。 – 2012-07-13 14:26:50

+0

现货上。非常感谢。 – 2012-07-13 14:28:07

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) 
+0

现货。非常感谢。 – 2012-07-13 14:27:23

0

它不应该是:

Code1.Substring(CharNo + 1, (Code1.Length - CharNo - 1)) 

因为Code1.Length - CharNo会给你一个额外的字符。

例:

"abc.abcd" 

你想要的最后4个字符,并length - charNo将导致5.因此错误。

+1

现货。非常感谢。 – 2012-07-13 14:27:09

0

谢谢大家。我应该意识到它需要-1。 这里有很多正确的答案,我不确定是否可以选择多个答案作为“接受的答案”。我会试一试。 非常感谢。

相关问题