Аргумент вне досягаемости

У меня есть переменная, в которой много контента, который мне нужно отсортировать. Но использование IndexOf и Substring просто дает мне ошибку, которая не так уж очевидна.

ArgumentOutOfRangeException: Аргумент вне допустимого диапазона.

Имя параметра: startIndex

Ошибка возникает в строке «string lookThroughString = ..».

Мой код просто пытается просмотреть строку, найти правильное содержимое и затем выплюнуть его.

private string SCRIPT_CONTENT;

public string GetVariable(string variable_name) {
    int length = 0;
    string lookThroughString = SCRIPT_CONTENT.Substring(SCRIPT_CONTENT.IndexOf(variable_name));

    foreach(char c in lookThroughString) {
        if(c.ToString() != ";") {
            length++;
        }
    }
    return SCRIPT_CONTENT.Substring(SCRIPT_CONTENT.IndexOf(variable_name + "::"), length);
}

«Сценарий» / «Контент», который я просматриваю, это:

spellName::Fireball;
spellID::1;

Я хочу, чтобы эта функция возвращалась в основном с начала введенного имени переменной (в данном случае «SpellName») и до первой точки с запятой.


person Kevin Jensen Petersen    schedule 08.01.2014    source источник


Ответы (1)


Проблема в том, что значение вашей переменной variable_name равно "SpellName", но значение в вашей строке на самом деле равно "spellName" (с строчными буквами s). Поскольку это имя переменной фактически не может быть найдено в строке, .IndexOf(variable_name) возвращает -1, а .Substring не может принимать в качестве параметра отрицательный индекс.

Быстрое решение — просто проверить результат IndexOf перед его использованием:

int index = SCRIPT_CONTENT.IndexOf(variable_name);
if (index < 0) {
    return string.Empty; // or throw an exception
}

string lookThroughString = SCRIPT_CONTENT.Substring(index);

Но мы можем упростить этот метод до:

public string GetVariable(string variable_name) {
    int startIndex = SCRIPT_CONTENT.IndexOf(variable_name);
    if (startIndex < 0) {
        return string.Empty; // or throw an exception
    }

    startIndex += variable_name.Length + 2;
    int endIndex = SCRIPT_CONTENT.IndexOf(";", startIndex);
    return SCRIPT_CONTENT.Substring(startIndex, endIndex - startIndex);
}

Или, если вы готовы использовать регулярные выражения, вы можете упростить его еще больше:

public string GetVariable(string variable_name) {
    var pattern = string.Format("{0}::(.*?);", Regex.Escape(variable_name));
    return Regex.Match(SCRIPT_CONTENT, pattern).Groups[1].ToString();
}
person p.s.w.g    schedule 08.01.2014
comment
Не совсем решил проблему. Он возвращает все в сценарии, а не только строку SpellName. - person Kevin Jensen Petersen; 08.01.2014
comment
@KevinJensenPetersen Что именно вы хотите, чтобы он вернул? Только "Fireball" или всю линейку? - person p.s.w.g; 08.01.2014
comment
На самом деле только слово Fireball, так как именно оно содержит переменную SpellName. Но я пытался начать с получения линии в первую очередь. - person Kevin Jensen Petersen; 08.01.2014
comment
Понятно... На самом деле это довольно просто, не знаю, почему я до этого не додумался. Я благодарю вас так много! Вы спасли меня от многих разочарований, пытаясь решить проблему. - person Kevin Jensen Petersen; 08.01.2014