如何在以下方法中停止ArgumentOutOfRangeException

时间:2014-04-10 15:46:50

标签: c#

当我尝试使用它来测试我的字符串时,如果它们包含数字和字母以外的字符,则以下代码会给出ArgumentOutOfRangeException。

猜测它是有道理的,因为我用注释标记的行将在最后一个索引的边界上运行。我如何解决这个问题,我不可能从(i-1,i)和(i,i)开始。请指教。谢谢。

public static bool LegalString(string s)
        {
            string dict = "abcdefghijklmnopqrstuvwxyz0123456789";
            for (int i = 0; i < s.Length; i++)
            {
                if (!dict.Contains(s.Substring(i, 1).ToLower()))
                {
                    Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'");//Line that is giving the error
                    return false;
                }
            }
            return true;
        }

编辑:

if (!LegalString(name))
            {
                MessageBox.Show("Invalid Entry for name. Enter only numbers and alphabets.");
            }

我正在使用上述方法。如果我输入一个名称,它将正常工作:Sam。

如果我输入例如,Sam ///它会在我希望显示消息框时返回异常。

5 个答案:

答案 0 :(得分:1)

你可以完全避免循环,use a built-in function to test for letter or digit就像这样:

public static bool LegalString(string s) {
    if (!s.All(Char.IsLetterOrDigit)) {
        Console.WriteLine( "'{0}'", s.First(c => !Char.IsLetterOrDigit(c)));
        return false;
    }
    return true;        
}

请注意,内置函数允许使用dict字符串中未包含的其他字母数字字符。如果这不合适,您可以插入自己的函数来检查单个字符的正确性。

答案 1 :(得分:0)

这一行中的i + 1是问题所在:

Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'");//Line that is giving the error

如果您尝试显示不在比较字符串中的子字符串,则需要将该行更改为:

Console.WriteLine("'" + s.Substring(i, 1).ToLower() + "'");//Line that is giving the error

修改

我修改了你的方法以获得以下内容,并且它的输入字符串是&#34; Sam //&#34;它按预期工作。即它返回false

public static bool LegalString(string s)
{
    string dict = "abcdefghijklmnopqrstuvwxyz0123456789";
    for (int i = 0; i < s.Length; i++)
    {
        if (!dict.Contains(s.Substring(i, 1).ToLower()))
        {
            return false;
        }
    }
    return true;
}

答案 2 :(得分:0)

顺便说一下,每次你可以写一个这样的函数时,看看dict

bool IsValidChar(char c)
{
  return char.IsDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}

答案 3 :(得分:0)

您可以使用正则表达式...

private static bool ContainsNonAlphanumeric(string s)
{
    Regex pattern = new Regex(@"\W|_");
    if(pattern.IsMatch(s))
    {
        return true;
    }
    return false;
}

看看这个小提琴...... http://dotnetfiddle.net/g2YAT0

答案 4 :(得分:0)

Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'")中的预期输出是多少。这就是错误,你期待一个长度为i + 1的子字符串。我不这么认为。也许应该是s.Lenght - 我,只有1。 看看吧。