Использование .length в подстроке (VB.NET)

Не могу понять, почему это не сработает.

Я пытаюсь проанализировать строку переменной длины, содержащую "." где-то внутри, а затем сорвите "." и все символы перед ним. Это вызывается через веб-службу.

При отладке он работает нормально, пока не выключается в последней строке ниже с сообщением браузера: «System.ArgumentOutOfRangeException: индекс и длина должны ссылаться на местоположение в строке. Имя параметра: длина»

У кого-нибудь есть идеи?

Code1 ниже — это входная переменная, передаваемая веб-службе из формы.

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

person Craig C    schedule 13.07.2012    source источник


Ответы (6)


Ваш расчет длины оставшейся строки неверен. Вы должны вычесть еще один:

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

Вы также можете просто опустить второй параметр, и он получит остальную часть строки:

Code1.Substring(CharNo + 1)
person Guffa    schedule 13.07.2012

Возможно, вы могли бы попробовать альтернативный и очень простой подход?

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 или выше.

person Holf    schedule 13.07.2012
comment
Кроме того, это будет работать правильно, только если строка содержит только одну точку. - person Steven Doggart; 13.07.2012
comment
Действительно, но в исходном вопросе указан один «.». Я отредактировал для других сценариев. - person Holf; 13.07.2012

Разве не должно быть:

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

Потому что Code1.Length - CharNo дает вам дополнительный символ.

Ex:

"abc.abcd"

Вам нужны последние 4 символа, а length - charNo приведет к 5. Следовательно, ошибка.

person Forte L.    schedule 13.07.2012

   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

Вышеупомянутое работает для меня безупречно ... может быть, вы получаете позицию -1 из метода IndexOf?

person Sk93    schedule 13.07.2012
comment
Оператор использует CharNo - 1 в качестве первого параметра, так как период не должен быть в результате. - person Guffa; 13.07.2012
comment
Вы упустили тот факт, что он добавлял + 1 к charNo внутри своего вызова SubString. - person Steven Doggart; 13.07.2012
comment
Не на месте, так как вывод будет .txt, а не txt. - person Guffa; 13.07.2012

Проблема в том, что вы добавляете единицу к начальному индексу (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)
person Steven Doggart    schedule 13.07.2012

Спасибо всем. Я должен был понять, что ему нужен -1. Здесь так много правильных ответов, что я не уверен, смогу ли я выбрать более одного в качестве «принятого ответа». Я попробую. Большое спасибо.

person Craig C    schedule 13.07.2012