我试图迭代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
语句,那么小写和大写检查会以某种方式工作。
我做错了什么?
编辑:感谢大家的回复,他们都非常好,内容丰富。如果我可以奖励多个正确答案,我会!
答案 0 :(得分:6)
continue
关键字跳转到字符串中的下一个字母(下一个foreach迭代)。如果你传递一个小写字母,它将在第一个if语句中递增,然后转到下一个字母。
在您的情况下,只需完全删除continue
语句,它就可以按预期运行。
答案 1 :(得分:5)
continue
突破了给定项目的foreach循环。由于任何字母都是字母数字,它会触及第一个继续并“跳出”,永远不会让其他语句有机会运行。
在您的情况下,听起来您应该删除该关键字的所有实例。一般来说,应该谨慎地“跳出”这样的循环,因为它可能导致这样的错误。
注意:break
可以在for
和while
循环中使用,以执行相同的操作,并提出相同的注意事项。
答案 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语句 它出现了。
在循环中,您有两个影响控制流的关键字:
在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;
}