引言
順序、選擇、循環是一切程序的三大結構。今天我們就來說一說循環中的一個小問題。
內容
c#的循環結構有四種:
- for
- while…do…
- do…while…
- foreach
在這四種結構中,都有循環結束的判斷。大于某個數字,小于某個數字,或者是其他條件表達式的判斷。今天我們就說一下關于數字的判斷。
我們的數字可能存放在定義好的一個變量中,也可能從是某個集合的長度,也可能是某個方法返回的信息。這里就討論一下某個方法的返回信息。
假定存在下面的一個方法,返回值是一個List<int>
1 |
static List<int> GetIntList() |
3 |
Console.WriteLine("第 {0} 進入GetIntList方法",Counter); |
5 |
return new List<int>(){ |
需要對這個方法的返回結果進行循環處理,剛開始大多數都會這么寫,以for循環為例。
1 |
for (int i = 0; i < GetIntList().Count; i++) |
后來知道的多了一些,或者是聽到別人說,經過自己的驗證。發現這個循環判斷條件有問題,每次判斷都會重新調用GetIntList方法,造成極大地浪費。就會修改成下面的樣子。
1 |
int len=GetIntList().Count; |
2 |
for (int i = 0; i < len; i++) |
先定義一個變量,保存集合的長度。
經過驗證,while…do、do…while也存在類似的問題,也需要注意。
有時候我們需要做的就是對集合里面的每個元素進行處理,我們會選用foreach這個便利的循環結構,因為他不用考慮下標越界的問題。從上面的驗證結果看,就會有人說下面的代碼有問題。
1 |
foreach (int i in GetIntList()) |
到底有沒有問題呢?需要驗證。
02 |
using System.Collections.Generic; |
05 |
using System.Data.Common; |
06 |
using System.Configuration; |
08 |
using AutoTest.ServiceLocator; |
09 |
using System.Reflection; |
10 |
using AutoTest.Common; |
16 |
static void Main(string[] args) |
18 |
Console.WriteLine("--Begin--"); |
21 |
Console.WriteLine("Foreach循環"); |
23 |
foreach (int i in GetIntList()) |
26 |
Console.WriteLine("For循環"); |
28 |
for (int i = 0; i < GetIntList().Count; i++) |
31 |
Console.WriteLine("do...while...循環"); |
38 |
while (num < GetIntList().Count ); |
39 |
Console.WriteLine("while...do...循環"); |
42 |
while (num < GetIntList().Count) |
47 |
Console.WriteLine("---End----"); |
52 |
static List<int> GetIntList() |
54 |
Console.WriteLine("第 {0} 進入GetIntList方法",Counter); |
56 |
return new List<int>(){ |
其實經過驗證,發現,foreach不同于其他三個循環結構,是不會發生重復的GetIntList方法調用的。
結論
1、foreach和其他三個循環結構不太一樣。
2、需要用事實說話。
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園