C# 如何在以下方法中停止ArgumentOutOfRangeException

C# 如何在以下方法中停止ArgumentOutOfRangeException,c#,C#,当我尝试使用ArgumentOutOfRangeException测试字符串(如果字符串包含数字和字母以外的字符)时,以下代码给出ArgumentOutOfRangeException 考虑到我用注释标记的行将超出最后一个索引的边界,我想这是有意义的。我如何解决这个问题,因为我不可能从(I-1,I)或(I,I)开始。请给我一些建议。谢谢 public static bool LegalString(string s) { string dict = "ab

当我尝试使用ArgumentOutOfRangeException测试字符串(如果字符串包含数字和字母以外的字符)时,以下代码给出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;
        }
我正在使用上述方法。如果我输入一个名称,例如:Sam,它将很好地工作


例如,如果我输入Sam///当我希望messagebox出现时,它将返回异常

这一行中的
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
编辑:

我对您的方法进行了修改,使其具有以下内容,并且它与输入字符串“Sam//”一样工作。i、 e.返回
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;
}
公共静态bool LegalString(字符串s)
{
字符串dict=“abcdefghijklmnopqrstuvxyz012456789”;
对于(int i=0;i
您可以完全避免循环,如下所示:

public static bool LegalString(string s) {
    if (!s.All(Char.IsLetterOrDigit)) {
        Console.WriteLine( "'{0}'", s.First(c => !Char.IsLetterOrDigit(c)));
        return false;
    }
    return true;        
}
bool IsValidChar(char c)
{
  return char.IsDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}

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

作为旁白,而不是每次编写这样的函数时都要仔细查看
dict

public static bool LegalString(string s) {
    if (!s.All(Char.IsLetterOrDigit)) {
        Console.WriteLine( "'{0}'", s.First(c => !Char.IsLetterOrDigit(c)));
        return false;
    }
    return true;        
}
bool IsValidChar(char c)
{
  return char.IsDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}
bool-IsValidChar(字符c)
{

return char.IsDigit(c)| |(c>='a'&&c='a'&&c您可以使用正则表达式来代替

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

看看这个提琴…

控制台的第行中,预期的输出是什么。WriteLine(““+s.Substring(i,i+1)。ToLower()+”)
。这就是错误所在,您预期的是长度为i+1的子字符串。我不这样认为。可能应该是s.lenght-i,只有1。
查看它。

这是正确的,但它对OP的代码执行的操作不同。它允许的操作不止这些characters@Selman22你说它允许比那些字符更多的字符是什么意思?@SriramSakthivel The
Char.IsleterOrdigit
允许用拉丁语以外的字母表示数字和字母的字符。我编辑了答案to提到这一点。@SriramSakthivel似乎OP希望允许拉丁字母表中的所有字符和数字(从0到9),但char.isleterOrdigit返回true。有关更多信息,请参阅documentation@dasblinkenlight这意味着使用内置方法并编写另一个类似于我的方法来验证这一点允许任何符号//返回TRUE不确定您的意思。我解释说您得到的异常来自
子字符串(I,I+1)
。如果子字符串不匹配,我不确定您试图显示什么。我只想显示一个消息框,如果子字符串不匹配,则显示“无效条目”。我将信息交换到(i,1)。如果我输入Sam,它工作正常。如果我输入Sam//,它会显示正确的消息框。当我输入Sam//,什么都不会发生。事实上,我也应该得到错误消息。好的,那么你有两个问题:1)修复异常(完成)2)处理“Sam//”的情况尝试了s.length-1和s.length-2,但返回相同的错误。