引言
順序、選擇、循環是一切程序的三大結構。今天我們就來說一說循環中的一個小問題。
內容
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、需要用事實說話。