引言
顺序、选择、循环是一切程序的三大结构。今天我们就来说一说循环中的一个小问题。
内容
c#的循环结构有四种:
- for
- while…do…
- do…while…
- foreach
在这四种结构中,都有循环结束的判断。大于某个数字,小于某个数字,或者是其他条件表达式的判断。今天我们就说一下关于数字的判断。
我们的数字可能存放在定义好的一个变量中,也可能从是某个集合的长度,也可能是某个方法返回的信息。这里就讨论一下某个方法的返回信息。
假定存在下面的一个方法,返回值是一个List<int>
1 |
static List<int> GetIntList() |
3 |
Console.WriteLine("第 {0} 进入GetIntList方法",Counter); |
5 |
return new List<int>(){ |
需要对这个方法的返回结果进行循环处理,刚开始大多数都会这么写,以for循环为例。
1 |
for (int i = 0; i < GetIntList().Count; i++) |
后来知道的多了一些,或者是听到别人说,经过自己的验证。发现这个循环判断条件有问题,每次判断都会重新调用GetIntList方法,造成极大地浪费。就会修改成下面的样子。
1 |
int len=GetIntList().Count; |
2 |
for (int i = 0; i < len; i++) |
先定义一个变量,保存集合的长度。
经过验证,while…do、do…while也存在类似的问题,也需要注意。
有时候我们需要做的就是对集合里面的每个元素进行处理,我们会选用foreach这个便利的循环结构,因为他不用考虑下标越界的问题。从上面的验证结果看,就会有人说下面的代码有问题。
1 |
foreach (int i in GetIntList()) |
到底有没有问题呢?需要验证。
02 |
using System.Collections.Generic; |
05 |
using System.Data.Common; |
06 |
using System.Configuration; |
08 |
using AutoTest.ServiceLocator; |
09 |
using System.Reflection; |
10 |
using AutoTest.Common; |
16 |
static void Main(string[] args) |
18 |
Console.WriteLine("--Begin--"); |
21 |
Console.WriteLine("Foreach循环"); |
23 |
foreach (int i in GetIntList()) |
26 |
Console.WriteLine("For循环"); |
28 |
for (int i = 0; i < GetIntList().Count; i++) |
31 |
Console.WriteLine("do...while...循环"); |
38 |
while (num < GetIntList().Count ); |
39 |
Console.WriteLine("while...do...循环"); |
42 |
while (num < GetIntList().Count) |
47 |
Console.WriteLine("---End----"); |
52 |
static List<int> GetIntList() |
54 |
Console.WriteLine("第 {0} 进入GetIntList方法",Counter); |
56 |
return new List<int>(){ |
其实经过验证,发现,foreach不同于其他三个循环结构,是不会发生重复的GetIntList方法调用的。
结论
1、foreach和其他三个循环结构不太一样。
2、需要用事实说话。
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn
文章转载自:博客园