`

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

 
阅读更多

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
分享到:
评论

相关推荐

    C#数据结构

    数据结构正是前人在思索问题的过程中所想出的解决方法。一般而言,在学 习程序设计一段时间后,学习“数据结构”便能让你的程序设计水平上一个台阶。 如果只学会了程序设计的语法和语义,那么你只能解决程序设计三分...

    c#高效的线程安全队列ConcurrentQueueT的实现

     .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会进行扩容,扩容的主要实现是开辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的...

    c#学习笔记.txt

    在 C# 中,类与结构在语义上是不同的。结构是值类型,而类是引用类型。 2, 装箱和拆箱(取消装箱) 装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将...

    .Net、C#读取excel表格数据存数据库

    .Net C# 读取Excel表格数据,根据表格数据结构在数据库新建一张对应的数据表既可以上传导入SQlServer数据库,代码有上传文件功能和解析表格数据功能,这里是建数据转成DataTable保存,导入速度对循环导入效率高很多...

    C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码

    快速排序是基于分治思想的原地排序的排序算法,将长度为N的数组排序所需时间和NlgN成正比,而且内循环比大多数排序算法都要短小和简单,因此一般情况比其他排序算法效率高。它的缺点是非常脆弱,某些情况可能导致它...

    C#,单向链表(Simply Linked List)快速排序(Quick Sort)算法与源代码

    各种数据结构、算法及实用的C#源代码.C#,单向链表(Simply Linked List)快速排序(Quick Sort)算法与源代码.单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部...

    C++程序设计基础实例教程

    循环结构 1.5 C++语言的作用 1. 求解计算问题 2. 大量数据的处理 3. 编写应用软件 4. 编写系统软件 1.6 C++语言的特点 精练、简洁、灵活、方便 运算符丰富,表达能力强 能部分代替汇编语言 目标代码效率高 可...

    完成端口(IOCP)高性能服务器源码

    最近有项目要做一个高性能网络服务器,决定下功夫搞定完成端口(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.unitypackage

    DOTween是一种快速,高效,完全类型安全的面向对象的动画引擎的团结,以优化C#用户,免费和开源,用吨的先进功能。 DOTween与Unity版本2018至3.5兼容。 适用于: Win,Mac,Linux,Unity WebPlayer,WebGL,...

    java面试题

    有第二分支,多分支,循环结构。循环本质上也是通过判断来实现的。 多形与继承? 答:多形:一个类中多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页...

    sesvc.exe 阿萨德

    但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, String&gt; map = new HashMap, String&gt;(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public...

    AppFramework_V1.0

    因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    这样ASP.NET就有四种组合:VB+ACCESS,VB+SQL,C#+ACCESS,C#+SQL,本教程会使用C#+ACCESS,兼顾四种来写,让大家对ASP.NET有一个全面的认识。虽然说学习ASP.NET不需要任何ASP基础,但是我觉得如果大家ASP不会,还是...

    二十三种设计模式【PDF版】

    一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...

    精通qt4编程(源代码)

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

    AppFramework_V1.0_New

    因为IBatisNet是直接把C#的基本类型(如int/DateTime)插入到数据库中字段的。对于一些C#值类型,例如int,并没有NULL状态。于是不得不采用一些特殊的值来表示NULL,例如int.MinValue。IBatisNet数据映射器会自动把int...

    精通Qt4编程(第二版)源代码

    \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 使用...

Global site tag (gtag.js) - Google Analytics