Нужна помощь с.string.substring (0, max.Length) - PullRequest
0 голосов
/ 12 февраля 2011

ArgumentOutofBounds Исключения выдается все время внутри if в цикле.

В этом коде я пытаюсь отправить две строки между символом @ 2 @ 3.

string1 + "@ 2 @ 3" + string2

Теперь я пытаюсь отделить строки от символов методом подстроки, но там создается исключение ......

public void seperatePMChattersNames(string TwoNames)
{
    string nameOne="";
    string nameTwo="";

    Console.WriteLine(TwoNames);
    for (int i = 0; i < TwoNames.Length; i++)
    {
        if (TwoNames[i] == '2' && TwoNames[i-1] == '@')///ArgumentOutofRange Exception
        {
                nameOne = TwoNames.Substring(0, i);
        }
        if (TwoNames[i] == '@' && TwoNames[i+1] == '3')///ArgumentOutofRange Exception
        {           
            nameTwo = TwoNames.Substring(i+1, TwoNames.Length);               
        }
    }
}

Почему его бросают и как его предотвратить?

Ответы [ 4 ]

1 голос
/ 12 февраля 2011

Ваш цикл начинается с i = 0, но в первом операторе if вы пытаетесь получить доступ к TwoNames [i-1], который пытается получить доступ к TwoNames [-1].Очевидно, что это вызовет проблему, поскольку TwoName [-1] не существует.

Ваш цикл должен начинаться с i = 1, а не с 0.

1 голос
/ 12 февраля 2011

Когда 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?
}

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

0 голосов
/ 12 февраля 2011

Это ответ

public void seperatePMChattersNames(string TwoNames)
        {
                Console.WriteLine(TwoNames);
                int x = TwoNames.IndexOf("@2");
                int y = TwoNames.IndexOf("@3");
                string nameone = TwoNames.Substring(0, x);
                string nametwo = TwoNames.Substring(y+2);
                Console.WriteLine(nameone);
                Console.WriteLine(nametwo);
        }
0 голосов
/ 12 февраля 2011
 for (int i = 0; i < TwoNames.Length; i++)

должно быть

 for (int i = 1; i < TwoNames.Length-1; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...