世俱杯 2025

C#中循环结构的效率问题

转帖|其它|编辑:郝浩|2011-07-08 17:40:55.000|阅读 483 次

概述:顺序、选择、循环是一切程序的三大结构。今天我们就来说一说循环中的一个小问题

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

引言

  顺序、选择、循环是一切程序的三大结构。今天我们就来说一说循环中的一个小问题。

内容

  c#的循环结构有四种:

  • for
  • while…do…
  • do…while…
  • foreach

  在这四种结构中,都有循环结束的判断。大于某个数字,小于某个数字,或者是其他条件表达式的判断。今天我们就说一下关于数字的判断。

  我们的数字可能存放在定义好的一个变量中,也可能从是某个集合的长度,也可能是某个方法返回的信息。这里就讨论一下某个方法的返回信息。

  假定存在下面的一个方法,返回值是一个List<int>

1 static List<int> GetIntList()
2 {
3      Console.WriteLine("第 {0} 进入GetIntList方法",Counter);
4      Counter++;
5      return new List<int>(){
6                 1,2,3,4,5};
7 }

  需要对这个方法的返回结果进行循环处理,刚开始大多数都会这么写,以for循环为例。

1 for (int i = 0; i < GetIntList().Count; i++)
2
3 }

  后来知道的多了一些,或者是听到别人说,经过自己的验证。发现这个循环判断条件有问题,每次判断都会重新调用GetIntList方法,造成极大地浪费。就会修改成下面的样子。

1 int len=GetIntList().Count;
2 for (int i = 0; i < len; i++)
3
4 }

  先定义一个变量,保存集合的长度。

  经过验证,while…do、do…while也存在类似的问题,也需要注意。

  有时候我们需要做的就是对集合里面的每个元素进行处理,我们会选用foreach这个便利的循环结构,因为他不用考虑下标越界的问题。从上面的验证结果看,就会有人说下面的代码有问题。

1 foreach (int i in GetIntList())
2
3 }

  到底有没有问题呢?需要验证。

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 using System.Data.Common;
06 using System.Configuration;
07 using MongoDB.Driver;
08 using AutoTest.ServiceLocator;
09 using System.Reflection;
10 using AutoTest.Common;
11   
12 namespace AutoTest
13 {
14     class Program
15     {
16         static void Main(string[] args)
17         {
18    Console.WriteLine("--Begin--");
19   
20   
21             Console.WriteLine("Foreach循环");
22             Counter = 1;
23             foreach (int i in GetIntList())
24             { 
25             }
26             Console.WriteLine("For循环");
27             Counter = 1;
28             for (int i = 0; i < GetIntList().Count; i++)
29             { 
30             }
31             Console.WriteLine("do...while...循环");
32             Counter =1;
33             int num=0;
34             do
35             {
36                 num++;
37             }
38             while (num < GetIntList().Count );
39             Console.WriteLine("while...do...循环");
40             Counter = 1;
41             num=0;
42             while (num < GetIntList().Count)
43             {
44                 num++;
45             };
46        
47             Console.WriteLine("---End----");
48             Console.ReadKey();
49   
50         }
51         static int Counter=1;
52         static List<int> GetIntList()
53         {
54             Console.WriteLine("第 {0} 进入GetIntList方法",Counter);
55             Counter++;
56             return new List<int>(){
57                 1,2,3,4,5};
58         }
59     }
60   
61      
62 }

  其实经过验证,发现,foreach不同于其他三个循环结构,是不会发生重复的GetIntList方法调用的。

结论

  1、foreach和其他三个循环结构不太一样。

  2、需要用事实说话。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP