所以我正在尝试使用SteamKit2进行一些实验。 当我试图为切换游戏制作类似命令的开关时,出现了一个问题。它自己的命令是'!play STEAM GAME APPID '。我想要子串做的只是检索AppID号 - 没有'!play'部分。我从6 SubStringed它(因为空的空格也算作字符),但现在我不确定如何使它从6到最大的子串。我使用的是在下面,但它不起作用(抛出System.ArgumentOutOfRangeException)。
private const string PlayCmd = "!play";
ProcessCommandSystem("!play 440");
private void ProcessCommandSystem(string message)
{
if (message.StartsWith(PlayCmd))
{
int appidnumeral;
string appidraw = message.Substring(6, (message.Length));
int.TryParse(appidraw, out appidnumeral);
Bot.SetGamePlaying(appidnumeral);
}
}
不确定为什么这不起作用,但我之后想要做的是在代码中,将字符串转换为Integer值,因为SetGamePlaying似乎不接受字符串,这就是我想要的原因对其进行子串(以关闭'!Play',仅限数字)并稍后将子函数转换为Integer值,以用于SetGamePlaying。
答案 0 :(得分:2)
Substring期望长度为第二个参数,即起始索引的长度。如果您将message.Length
添加到6,则明显超出字符串的长度6。
如果您想休息,请使用overload without a second parameter:
string appidraw = message.Substring(6);
答案 1 :(得分:1)
您正在尝试使用字符串的全长:
string appidraw = message.Substring(6, (message.Length));
超出输入字符串的范围。
您需要缩短起始位置所需的金额:
string appidraw = message.Substring(6, (message.Length - 6));
使长度保持在范围内。但是,正如蒂姆在his answer中指出的那样,如果你只是采用字符串的右手部分,则根本不需要长度参数:
string appidraw = message.Substring(6);
或者,您只需从字符串中删除命令:
string appidraw = message.Replace("!play ", "");
然而,这将删除所有出现的“!play”而不仅仅是第一次出现,因此应谨慎使用。
答案 2 :(得分:1)
Substring
有两个参数:起始索引和子字符串的长度。你的第一个论点是正确的,但是你需要将你的第二个参数改为(message.Length) - 6
来给出:
string appidraw = message.Substring(6, (message.Length - 6));
作为旁注,在C#中,您从0
而不是1
开始计算,因此字符串中最后一个字符的索引将是其长度减去1
。因此,如果您需要引用最后一个字符,则可以使用message.Length - 1
。
答案 3 :(得分:0)
Substring
想要开始索引和char的数量,而不是最后一个索引(无论如何都是message.Length -1)
使用
string appidraw = message.Substring(6, (message.Length - 6));