【问题标题】:Use Of .length in Substring (VB.NET)在子字符串中使用 .length (VB.NET)
【发布时间】:2012-07-13 14:08:43
【问题描述】:

无法弄清楚为什么这不起作用。

我正在尝试分析包含“。”的可变长度字符串。里面的某个地方,然后去掉“。”以及它之前的所有字符。这是通过网络服务调用的。

调试时,它可以正常工作,直到它在下面的最后一行退出,并带有浏览器消息: “System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。 参数名称:长度 "

有人知道吗?

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

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

【问题讨论】:

    标签: vb.net indexof string-length


    【解决方案1】:

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

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

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

    Code1.Substring(CharNo + 1)
    

    【讨论】:

      【解决方案2】:

      也许您可以尝试另一种非常简单的方法?

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

      【讨论】:

      • 另外,这只有在字符串只包含一个句点时才能正常工作。
      • 确实,但原始问题确实指定了一个“。”。我进行了编辑以适应其他情况。
      【解决方案3】:

      不应该是:

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

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

      例如:

      "abc.abcd"
      

      您想要最后 4 个字符,而length - charNo 将导致 5。因此错误。

      【讨论】:

        【解决方案4】:
           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 的位置吗?

        【讨论】:

        • 该操作使用 CharNo - 1 作为第一个参数,因为句点不应该在结果中。
        • 您忽略了他在对SubString 的调用中将+ 1 添加到charNo 的事实。
        • 不正确,因为输出将是“.txt”,而不是“txt”。
        【解决方案5】:

        问题是您在起始索引 (CharNo + 1) 中添加了 1,但您并没有从长度中减去 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)
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2014-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-17
            • 1970-01-01
            • 1970-01-01
            • 2011-10-24
            • 1970-01-01
            相关资源
            最近更新 更多