Когда i
равен нулю, TwoNames[i - 1]
будет пытаться получить доступ к индексу -1 строки, которого не существует.
Если i
равно TwoNames.Length - 1
, TwoNames[i + 1]
попытается получить доступ после конца строки.
Далее, когда вы нашли"@ 3", вы используете:
TwoNames.Substring(i+1, TwoNames.Length)
второй параметр подстроки - это длина подстроки, которую нужно взять, а не конечный индекс. Если вам нужна только остальная часть строки, вы можете опустить второй аргумент:
TwoNames.Substring(i+1)
Обратите внимание, что это будет включать "3", хотя вы, вероятно, действительно хотите i + 2 вместо i + 1.
Есть ли причина, по которой вы не используете string.IndexOf(TwoNames, "@2")
и т. Д.?
Если вы просто хотите, чтобы nameOne
была строкой до первых «@ 2», а nameTwo
- строкой после последней «@ 3», вы можете использовать:
int endOfOne = TwoNames.IndexOf("@2");
if (endOfOne != -1)
{
nameOne = TwoNames.Substring(0, endOfOne);
}
else
{
// Couldn't find @2... throw exception perhaps?
}
int startOfTwo = TwoNames.LastIndexOf("@3");
if (startOfTwo != -1)
{
// Allow for the "@3" itself
nameTwo = TwoNames.Substring(startOfTwo + 2);
}
else
{
// Couldn't find @3... throw exception perhaps?
}
Другой вариант, конечно, использовать регулярные выражения - они сами добавляют степень сложности, но на самом деле они нацелены на сопоставление с образцом. Если вы обнаружите, что вам нужно получить еще больше кусочков, они могут помочь.