Foreach with continue - 意外行为

时间:2014-09-26 18:23:22

标签: c#

我试图迭代atring来计算某些类型字符的出现次数。

但是,我不确定我的逻辑是什么问题。

foreach (var character in stringToCount)
{
    if (char.IsLetterOrDigit(character))
    {
        alphaNumericCount++;
        continue;
    }

    if (char.IsLower(character))
    {
        lowercaseCount++;
        continue;
    }

    if (char.IsUpper(character))
    {
        uppercaseCount++;
        continue;
    }
}

仅增加alphaNumericCount变量,并忽略任何小写或大写字符。我想我误解了continue关键字的使用。

如果我注释掉第一个if语句,那么小写和大写检查会以某种方式工作。

我做错了什么?

编辑:感谢大家的回复,他们都非常好,内容丰富。如果我可以奖励多个正确答案,我会!

5 个答案:

答案 0 :(得分:6)

continue关键字跳转到字符串中的下一个字母(下一个foreach迭代)。如果你传递一个小写字母,它将在第一个if语句中递增,然后转到下一个字母。

在您的情况下,只需完全删除continue语句,它就可以按预期运行。

答案 1 :(得分:5)

continue突破了给定项目的foreach循环。由于任何字母都是字母数字,它会触及第一个继续并“跳出”,永远不会让其他语句有机会运行。

在您的情况下,听起来您应该删除该关键字的所有实例。一般来说,应该谨慎地“跳出”这样的循环,因为它可能导致这样的错误。

注意:break可以在forwhile循环中使用,以执行相同的操作,并提出相同的注意事项。

答案 2 :(得分:3)

您应该使用else if

foreach (var character in stringToCount)
{
    if (char.IsLetterOrDigit(character))
    {
        alphaNumericCount++;

        if (char.IsLower(character))
            lowercaseCount++;

        else if (char.IsUpper(character))
            uppercaseCount++;
    }
}

因为Continue会跳过当前迭代的剩余代码并跳转到下一次迭代。

答案 3 :(得分:2)

  

继续(C#参考)

     

continue语句将控制权传递给 next   迭代while,do,for或foreach语句   它出现了。

在循环中,您有两个影响控制流的关键字:

  1. break - 就像一个转到END
  2. 继续 - 就像转到下一页
  3. 在C#中,IEnumerable(或任何提供具有适当枚举器对象的GetEnumerator()方法的对象的foreach()循环是通过首先获取集合的枚举器对象,访问集合中的每个项目(枚举器)来实现的。 )使用enumerator.MoveNext(),并使用enumerator.Current访问该当前项;

    作为一项心理练习,如果您没有foreach()或任何其他循环结构,您可以使用 goto 和标签来实现它。

    foreach(var item in container) // translates to lines 1 - 4 below
    {
        if(foo) continue;          // line 5
        if(bar) break;             // line 6
        // do something
    }
    

    转换为

     1:       var enumerator = container.GetEnumerator();  // initialize the enumerator
     2: next: if(enumerator.MoveNext()) 
     3:       {
     4:          var item = enumerator.Current;  // get item to work on (the "topic")
     5:          if(foo) goto next;              // 'continue' keyword - skips to next
     6:          if(bar) goto end;               // 'break' keyword - exits loop
     7:          // do something
     8:          goto next;                      // normal loop iteration to next item
     9:       }    
    10: end:                                     // loop done
    

    根据问题,如果你想在同一个循环中遇到多个条件,不要使用continue;对于当前迭代,continue将跳过它之后的所有内容。使用单独的独立条件,以便他们都有机会执行。

答案 4 :(得分:1)

在我看来,这是迄今为止最易读的方法:

int alphaNumericCount = stringToCount.Count(char.IsLetterOrDigit);
int lowercaseCount = stringToCount.Count(char.IsLower);
int uppercaseCount = stringtoCount.Count(char.IsUpper);

如果你无法忍受重复迭代,那么:

foreach(var c in stringToCount.Where(char.IsLetterOrDigit))
{
    ++alphaNumericCount;
    if (char.IsLower(c)) ++lowercaseCount;
    if (char.IsUpper(c)) ++uppercaseCount;
}