程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中循環結構的效率問題

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 < 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、需要用事實說話。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved