zoukankan      html  css  js  c++  java
  • C#中循环结构的效率问题 Virus

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

    【Blog】http://virusswb.cnblogs.com/

    【MSN】jorden008@hotmail.com

    【说明】转载请标明出处,谢谢

    反馈文章质量,你可以通过快速通道评论:

  • 相关阅读:
    替换OSD操作的优化与分析
    Centos7下Jewel版本radosgw服务启动
    如何统计Ceph的RBD真实使用容量
    Ceph中的Copyset概念和使用方法
    Proftp最简匿名访问配置
    Windows could not set the offline local information.Error code:0X80000001解决方法
    《一百岁感言》 杨绛
    取扑克牌的问题
    马云的懒人理论
    明代地图总目
  • 原文地址:https://www.cnblogs.com/virusswb/p/2074991.html
Copyright © 2011-2022 走看看