是否可以在 for 循环中“继续”foreach 循环?

Is it possible to `continue` a foreach loop while in a for loop?

好的,所以我想做的事情听起来应该很简单。我有一个方法可以检查字符串中的每个字符是否是从 a 到 m 的字母。我现在必须 continue 一个 foreach 循环,而在一个 for 循环中。有没有办法做我想做的事?

public static string Function(String s)
{
    int error = 0;
    foreach (char c in s)
    {
        for (int i = 97; i <= 109; i++)
        {
            if (c == (char)i)
            {
                // Here immediately continue the upper foreach loop, not the for loop
                continue;
            }
        }
        error++;
    }

    int length = s.Length;
    return error + "/" + length;
}

如果有字符不在a到m的范围内,则error加1。最后,函数应该 return 错误数和字符串中的总字符数,f.E: "3/17".

编辑

我想实现的是不可能的。 中演示了一些变通方法,方法是使用临时变量。

其他答案通过简单地改进我的代码直接解决了我的问题。

我认为('a' == (char)i)应该是(c == (char)i)
为什么不将 for 替换为 if((int)c >= 97 && (int)c <= 109)? 您的解决方案可能有效,但性能极差

使用 LINQ 怎么样:

int errors = s
    .Count(c => !Enumerable.Range(97, 13).Contains(c));

那就不用跳出循环了

或者完全避免嵌套循环,这将提高性能:

int errors = s.Count(c => c < 97 || c > 109);

char 可隐式转换为 int,因此无需转换。

continue 将跳过该迭代中的更多行,如果您需要 break 退出循环,请使用 break。

public static string Function(String s)
{
    int error = 0;
    foreach (char c in s)
    {
        for (int i = 97; i <= 109; i++)
        {
            if ('a' == (char)i)
            {
                break; // break the whole looping, continue will break only the iteration
            }
        }
        error++;
    }
    string length = Convert.ToString(s.Length);
    return error + "/" + length;
}

您可以通过打破内部循环来做到这一点,这意味着内部循环将被转义,就像迭代结束一样。在此之后,您可以使用布尔值来控制 continue if 其余的底层逻辑过程:

    public static string Function(String s)
    {
        int error = 0;
        foreach (char c in s)
        {
            bool skip = false; 

            for (int i = 97; i <= 109; i++)
            {
                if ('a' == (char)i)
                {
                    skip = true;
                    break;
                }
            }

            if (skip) continue;
            error++;
        }
        string length = Convert.ToString(s.Length);
        return error + "/" + length;
    }

正则表达式非常适合处理这种类型的 "problem" 并且更加灵活......一方面,您不会局限于连续字符。以下控制台应用演示了如何使用正则表达式从目标字符串中提取所需信息。

private static string TestSearchTextRegex(string textToSearch)
{
    var pattern = "[^a-m]";
    var ms = Regex.Matches(textToSearch, pattern);

    return $"{ms.Count}/{textToSearch.Length}";
}


注意

模式“[^a-m]”基本上是说:在字符集中找到不是 (^) 的匹配项。这种模式可以很容易地定义为“[^a-mz]”,除了字符 "a-m" 之外,它还会将 "z" 视为不计入错误组的字符。

Regex 解决方案的另一个优点是,您可以使用您要查找的实际字符,而不是代表该字符的数字。