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

简介:

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

 

引言

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

内容

c#的循环结构有四种:

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

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

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

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

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

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

for (int i = 0; i < GetIntList().Count; i++) { }

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

int len=GetIntList().Count; for (int i = 0; i &lt; len; i++) { }

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

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

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

foreach (int i in GetIntList()) { }

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Common; using System.Configuration; using MongoDB.Driver; using AutoTest.ServiceLocator; using System.Reflection; using AutoTest.Common; namespace AutoTest { class Program { static void Main(string[] args) { Console.WriteLine("------------------------------Begin------------------------------"); Console.WriteLine("Foreach循环"); Counter = 1; foreach (int i in GetIntList()) { } Console.WriteLine("For循环"); Counter = 1; for (int i = 0; i &lt; GetIntList().Count; i++) { } Console.WriteLine("do...while...循环"); Counter =1; int num=0; do { num++; } while (num &lt; GetIntList().Count ); Console.WriteLine("while...do...循环"); Counter = 1; num=0; while (num &lt; GetIntList().Count) { num++; }; Console.WriteLine("------------------------------End------------------------------"); Console.ReadKey(); } static int Counter=1; static List&lt;int> GetIntList() { Console.WriteLine("第 {0} 进入GetIntList方法",Counter); Counter++; return new List<int>(){ 1,2,3,4,5}; } } } 其实经过验证,发现,foreach不同于其他三个循环结构,是不会发生重复的GetIntList方法调用的。

 

结论

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

2、需要用事实说话。

 

Technorati 标签:  循环, for, foreach, while



本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/583341,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
C#
C# 一分钟浅谈:循环结构 for 和 while 的应用
【9月更文挑战第1天】循环结构是编程中的基础概念,C# 中常用的 `for` 和 `while` 循环允许重复执行代码直至满足特定条件。`for` 循环基于计数,适用于已知循环次数的情况;`while` 循环基于条件,适用于未知循环次数的情况;`do-while` 循环则至少执行一次循环体。本文详细介绍了这些循环的语法和示例,并探讨了常见问题及其解决方法,如循环条件和更新表达式的错误设置。通过综合应用示例(如计算阶乘和斐波那契数列),帮助读者更好地理解和掌握循环结构的使用方法。正确使用循环可以提高程序的效率和可读性。
66 2
|
6月前
|
安全 程序员 C#
C#循环结构
C#循环结构
112 0
C#中的循环结构
C#中的循环结构
71 0
C#基础Ⅴ-顺序、分支、循环结构
C#基础Ⅴ-顺序、分支、循环结构
|
程序员 C#
☀️ 学会编程入门必备 C# 最基础知识介绍——带你认识 C# 中的几种循环结构( for & while & do...while)
前言👻 C# for/foreach 循环🎈 for 流程图 foreach C# while循环🎉 语法 流程图 C# do...while 循环🎄 语法 流程图 C# 嵌套循环👍 语法 循环控制语句🎊 C# break 语句 语法 流程图 C# continue 语句 语法 流程图 无限循环💫 总结💬
☀️ 学会编程入门必备 C# 最基础知识介绍——带你认识 C# 中的几种循环结构( for & while & do...while)
|
6月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
188 3
|
6月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
196 3
|
6天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
18 3
|
27天前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
|
2月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
39 2