if语句基于子字符串长度排序

时间:2018-08-10 02:28:47

标签: c#

我遇到一个问题,我得到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个字符。

3 个答案:

答案 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。这取决于您的代码的性能/情况