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

开发 后端
循环结构是所有程序语言中都有的,本文主要介绍的是循环结构的效率问题。希望会对你有帮助,一起来看。

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

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

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

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

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

结论

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

2、需要用事实说话。

【编辑推荐】

  1. c#.net实体类序列化方法
  2. 浅析C#插件式程序开发经验
  3. 深入C# 序列化(Serialize)、反序列化(Deserialize)
  4. 用C#实现文件夹拷贝
  5. C#中的闭包是怎么捕获变量的
责任编辑:于铁 来源: 博客园
相关推荐

2009-02-05 15:32:23

接口委托

2009-08-28 17:18:55

foreach循环

2009-08-24 16:11:35

C#项目开发

2009-08-28 16:37:32

C# for循环

2011-09-21 10:56:31

C#结构

2010-08-26 10:41:45

C#内部类

2009-06-24 17:32:40

动态加载AppDoma

2009-08-27 16:18:47

C#类C#结构体

2009-08-20 15:26:42

C#循环语句

2010-07-12 09:07:30

C#

2009-08-07 11:26:53

C#数组结构

2009-08-14 11:05:28

C#语言的结构体

2009-08-13 14:46:03

C#结构体定义

2009-08-13 11:18:50

C#结构体

2009-08-21 17:24:18

C#控制摄像头

2009-09-08 15:28:24

C#委托

2009-08-17 15:52:42

C#多态

2009-09-28 10:09:09

Linux内核Linux循环链表

2010-09-08 17:15:45

SQL循环结构

2009-06-24 09:52:21

哈希表
点赞
收藏

51CTO技术栈公众号