C# 参数超出范围

C# 参数超出范围,c#,.net,string,substring,C#,.net,String,Substring,我有一个变量,它有很多我需要整理的内容。 但是使用IndexOf和Substring,只会给我一个不太明显的错误 ArgumentOutOfRangeException:参数超出范围 参数名称:startIndex 错误发生在“字符串查找字符串=…”行上 我的代码只是试图通过字符串查找,找到正确的内容,然后将其吐出来 private string SCRIPT_CONTENT; public string GetVariable(string variable_name) { int

我有一个变量,它有很多我需要整理的内容。 但是使用IndexOf和Substring,只会给我一个不太明显的错误

ArgumentOutOfRangeException:参数超出范围

参数名称:startIndex

错误发生在“字符串查找字符串=…”行上

我的代码只是试图通过字符串查找,找到正确的内容,然后将其吐出来

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”)返回,直到第一个分号。

问题是
变量名
变量值是
“SpellName”
,但字符串中的值实际上是
“SpellName”
(小写
s
)。由于在字符串中实际上找不到该变量名,
.IndexOf(variable\u 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);

没有完全解决这个问题。它返回“脚本”中的所有内容,而不是仅返回“拼写名称”行。@KevinJensenPetersen您希望它返回什么?只有
“Fireball”
或整行?实际上只有“Fireball”一词,因为这是SpellName变量包含的内容。但我试着先把电话线接过来。我明白了。。这其实很简单,我不知道为什么我没有想到这一点。我非常感谢你!你让我在解决问题的过程中避免了很多挫折。
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();
}