C#中循环结构的效率问题
引言
顺序、选择、循环是一切程序的三大结构。今天我们就来说一说循环中的一个小问题。
内容
c#的循环结构有四种:
- for
- while…do…
- do…while…
- foreach
在这四种结构中,都有循环结束的判断。大于某个数字,小于某个数字,或者是其他条件表达式的判断。今天我们就说一下关于数字的判断。
我们的数字可能存放在定义好的一个变量中,也可能从是某个集合的长度,也可能是某个方法返回的信息。这里就讨论一下某个方法的返回信息。
假定存在下面的一个方法,返回值是一个List
static List GetIntList()
{
Console.WriteLine("第 {0} 进入GetIntList方法",Counter);
Counter++;
return new List(){
1,2,3,4,5};
}
需要对这个方法的返回结果进行循环处理,刚开始大多数都会这么写,以for循环为例。
for (int i = 0; i < GetIntList().Count; i++)
{
}
后来知道的多了一些,或者是听到别人说,经过自己的验证。发现这个循环判断条件有问题,每次判断都会重新调用GetIntList方法,造成极大地浪费。就会修改成下面的样子。
int len=GetIntList().Count;
for (int i = 0; i < 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 < GetIntList().Count; i++)
{
}
Console.WriteLine("do...while...循环");
Counter =1;
int num=0;
do
{
num++;
}
while (num < GetIntList().Count );
Console.WriteLine("while...do...循环");
Counter = 1;
num=0;
while (num < GetIntList().Count)
{
num++;
};
Console.WriteLine("------------------------------End------------------------------");
Console.ReadKey();
}
static int Counter=1;
static List GetIntList()
{
Console.WriteLine("第 {0} 进入GetIntList方法",Counter);
Counter++;
return new List(){
1,2,3,4,5};
}
}
}
其实经过验证,发现,foreach不同于其他三个循环结构,是不会发生重复的GetIntList方法调用的。
结论
1、foreach和其他三个循环结构不太一样。
2、需要用事实说话。
Technorati 标签:
循环,
for,
foreach,
while
分享到:
相关推荐
数据结构正是前人在思索问题的过程中所想出的解决方法。一般而言,在学 习程序设计一段时间后,学习“数据结构”便能让你的程序设计水平上一个台阶。 如果只学会了程序设计的语法和语义,那么你只能解决程序设计三分...
.Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会进行扩容,扩容的主要实现是开辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的...
在 C# 中,类与结构在语义上是不同的。结构是值类型,而类是引用类型。 2, 装箱和拆箱(取消装箱) 装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将...
.Net C# 读取Excel表格数据,根据表格数据结构在数据库新建一张对应的数据表既可以上传导入SQlServer数据库,代码有上传文件功能和解析表格数据功能,这里是建数据转成DataTable保存,导入速度对循环导入效率高很多...
快速排序是基于分治思想的原地排序的排序算法,将长度为N的数组排序所需时间和NlgN成正比,而且内循环比大多数排序算法都要短小和简单,因此一般情况比其他排序算法效率高。它的缺点是非常脆弱,某些情况可能导致它...
各种数据结构、算法及实用的C#源代码.C#,单向链表(Simply Linked List)快速排序(Quick Sort)算法与源代码.单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部...
循环结构 1.5 C++语言的作用 1. 求解计算问题 2. 大量数据的处理 3. 编写应用软件 4. 编写系统软件 1.6 C++语言的特点 精练、简洁、灵活、方便 运算符丰富,表达能力强 能部分代替汇编语言 目标代码效率高 可...
最近有项目要做一个高性能网络服务器,决定下功夫搞定完成端口(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。 但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天...
统计结果:词典加载时间1.8s左右,分词效率每秒2Mb多,近100万词。 2 Processor Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz 12G 测试效果 time elapsed:19597, rate:3140.428063kb/s, words:1158340.52/s time ...
DOTween是一种快速,高效,完全类型安全的面向对象的动画引擎的团结,以优化C#用户,免费和开源,用吨的先进功能。 DOTween与Unity版本2018至3.5兼容。 适用于: Win,Mac,Linux,Unity WebPlayer,WebGL,...
有第二分支,多分支,循环结构。循环本质上也是通过判断来实现的。 多形与继承? 答:多形:一个类中多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页...
但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, String> map = new HashMap, String>(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public...
因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...
这样ASP.NET就有四种组合:VB+ACCESS,VB+SQL,C#+ACCESS,C#+SQL,本教程会使用C#+ACCESS,兼顾四种来写,让大家对ASP.NET有一个全面的认识。虽然说学习ASP.NET不需要任何ASP基础,但是我觉得如果大家ASP不会,还是...
一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(...
因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...
\9.5.4 效率问题 260 \9.6 小结 260 \第10章 多线程 261 \10.1 启动一个线程 261 \10.2 线程互斥与同步 264 \10.2.1 临界区问题 265 \10.2.2 使用QMutex 265 \10.2.3 使用QSemaphore 266 \10.2.4 使用QWaitConditon ...
因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...
\9.5.4 效率问题 260 \9.6 小结 260 \第10章 多线程 261 \10.1 启动一个线程 261 \10.2 线程互斥与同步 264 \10.2.1 临界区问题 265 \10.2.2 使用QMutex 265 \10.2.3 使用QSemaphore 266 \10.2.4 使用...