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,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
安全 程序员 C#
C#循环结构
C#循环结构
21 0
|
9月前
|
C#
C#中的循环结构
C#中的循环结构
52 0
|
9月前
|
C#
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)
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
20 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
75 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
57 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
38 0