我遇到一个问题,我得到ArgumentOutOfRangeException,这是由于我的字符串是5个字符,而我的子字符串从字符6开始。问题是,如果子字符串超出了范围,我希望我的代码忽略它字符串。
if(tok[i] == "PRINT"){
if(tok[i+1].Substring(0,3) == "NUM"){
Console.WriteLine(tok[i+1].Substring(4));
}else if(tok[i+1].Substring(0,4) == "EXPR"){
Console.WriteLine(tok[i+1].Substring(5));
}else if(tok[i+1].Substring(0,6) == "STRING"){
Console.WriteLine(tok[i+1].Substring(8));
}
}
因此,我的解决方案是对如上所示的if语句进行排序,从最小的子字符串检查到最大的子字符串检查;但是,我认为有一个更好的方法可以做到这一点,而我却没有。感谢您提供任何反馈意见。
输入:
print "test"
print "asd"
print "last"
print 1
print 123894
因此,如果我首先测试STRING,则当字符串到达“ print 1”时会出现错误,因为STRINGs子字符串从字符8开始,大于“ print 1”的7个字符。
答案 0 :(得分:0)
这里是一种重构:
var token = tok[i + 1];
var length = token.Length;
var start = token.SubString(0, 3);
var value = "";
if (start == "NUM")
{
value = token.SubString(4, length - 1);
}
else if (start == "EXP")
{
Debug.Assert(token.SubString(4, 1) == "R");
value = token.SubString(5, length - 1);
}
else if (start == "STR")
{
Debug.Assert(token.SubString(4, 3) == "ING");
value = token.SubString(8, length - 1);
}
答案 1 :(得分:0)
这是我的建议。
string[] tokens = { "NUMBER", "EXPRESSION", "STRING", "INTEGER" };
for (int i = 0; i < tokens.Length; i++)
{
string input = tokens[i];
if (input.Substring(0, Math.Min(input.Length, 3)) == "NUM")
{
Console.WriteLine(input.Substring(3));
}
else if (input.Substring(0, Math.Min(input.Length, 4)) == "EXPR")
{
Console.WriteLine(input.Substring(4));
}
else if (input.Substring(0, Math.Min(input.Length, 6)) == "STRING")
{
Console.WriteLine(input.Substring(6));
}
}
答案 2 :(得分:0)
可以执行以下操作:
string input = "print NUM";
string[] tokens = new[] { "NUM", "EXPR", "STRING" };
var myList = new List<string>(tokens);
var searchTerm =string.IsNullOrEmpty(input) ? "" : input.Substring("print".Length, input.Length - "print".Length).Trim();
var pos = myList.IndexOf(searchTerm);
switch (pos)
{
// its NUM
case 0:
...
// its EXPR
case 1:
...
// its STRING
case 2:
// not found or default
case -1:
}
您还可以使用HashSet。这取决于您的代码的性能/情况