【问题标题】:Is it possible to `continue` a foreach loop while in a for loop?在 for 循环中是否可以“继续”foreach 循环?
【发布时间】:2020-09-21 00:14:28
【问题描述】:

好的,所以我想做的事情听起来应该很简单。我有一种方法可以检查字符串中的每个字符是否是从 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。最后,该函数应返回错误数和字符串中的总字符数,f.E: "3/17"。

编辑

我想要实现的目标是不可能的。在BsdDaemon's answer 中演示了使用临时变量的解决方法。

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

【问题讨论】:

  • @Sweeper 这个 Java 问题不会直接转换为 C#,因为没有标签循环或标签中断语句。
  • @Sweeper 我试过了,但没用。我也试过break;,但唯一有效的是goto;,但这对我没有帮助。
  • @Klaycon 哦,哎呀!认为这是一个 Java 问题...
  • 您的意思是if (c == (char)i)?为什么不foreach (char c in s) { if (c &lt; 'a' || c &gt; 'm') { error++; } }?甚至(使用 LINQ)int error = s.Count(c =&gt; c &lt; 'a' || c &gt; 'm');.
  • 您可能会考虑我添加到您正在处理的“问题”的可能解决方案中的Regex 示例。

标签: c# for-loop foreach nested-loops continue


【解决方案1】:

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

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 解决方案的另一个优点是,您可以使用与代表该字符的数字相对应的实际字符。

【讨论】:

    【解决方案2】:

    如何使用 LINQ:

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

    那么就不需要跳出循环了。

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

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

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

    【讨论】:

      【解决方案3】:

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

          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;
          }
      

      【讨论】:

      • 这可能是解决方案,谢谢!让我试试看。
      • 很高兴先生!如果您有任何问题,请告诉我。
      【解决方案4】:

      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;
      }
      

      【讨论】:

      • 这将导致error 增加,即使对于有效字符也是如此。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-09
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        • 1970-01-01
        相关资源
        最近更新 更多