foreach迴圈研究及迭代器
1.ienumerable介面:
命名空間:system.collections(system.collections 命名空間包含介面和類,這些介面和類定義各種物件(如列表、佇列、位陣列、雜湊表和字典)的集合。)
ienumerable 包含單一方法 getenumerator,該方法返回 ienumerator。
ienumerator 提供了通過公開 current 屬性和 movenext 和 reset 方法來迴圈訪問集合的功能。
ienumerable.getenumerator方法返回迴圈訪問集合的列舉數,返回值為ienumerator 物件。
最初,列舉數定位在集合中第乙個元素的前面。 reset 方法還將列舉器恢復到此位置。 在此位置,current 屬性是不確定的。 因此,在讀取 current的值之前,必須呼叫 movenext 方法將列舉器推進到集合的第乙個元素。
2.foreach 迴圈的實現方式:
首先,使用foreach結構可以迭代乙個陣列,因為system.array類實現了ienumerable介面,這個介面的唯一方法getenumerator()可以迭代集合中的各項。
foreach迴圈迭代乙個collectionobject集合的過程:
a,呼叫collectionobject.getenumerator(),返回乙個ienumerator引用,
b,呼叫所返回的ienumerator介面的movenext()方法,
c,movenext返回true,就使用ienumerator介面的current屬性來獲取物件的乙個引用,用於foreach迴圈,
d,重複前面兩步,直到movenext()方法返回false為止,此時迴圈停止。
若需在類中進行這些操作,必須重寫幾個方法,跟蹤索引,維護current屬性,以及執行其他一些操作,乙個較為簡單的替代方法是使用迭代器。
3.迭代器
迭代器的定義是,它是乙個**塊,按順序提供了要在foreach塊中使用的所有值。
一般情況下,這個**塊是乙個方法,但也可以使用屬性訪問器和其他**塊作為迭代器。
無論**塊是什麼,其返回型別都是有限的。而迭代器塊的返回型別是前面提到的介面型別ienumerable和ienumerator。使用這兩個型別的場合是:
a,如果要迭代乙個類,可使用方法getenumerator(),其返回型別是ienumerator。
b,如果要迭代乙個類成員,例如方法,則使用ienumerable。
在迭代器塊中,使用yield關鍵字選擇要在foreach迴圈中使用的值。
乙個簡單的迭代器(封裝素數):
using system;
using system.collections;
using system.collections.generic;
using system.text;
namespace ch11ex03
public primes(long minimum,long maximum)
else
max = maximum;
}public ienumerator getenumerator()
}if (isprime)}}
}}
main函式執行:
static void main(string args)
");}
console.readkey();
"hello world!");
}
說明:此迭代器可以列舉上下限之間的素數集合。foreach迴圈執行in collention時,進入迭代器執行
collectionobject.getenumerator(),然後yield返回迴圈值。
如果把上下限設定為非常大的數,在程式執行時會發現,一次顯示乙個結果,中間有暫停,而不是一次顯示所有結果。這說明,無論**在yield呼叫之間是否終止,迭代器**都會一次返回乙個結果。如果在除錯模式下執行**,會發現呼叫yield會中斷**的執行,當請求乙個值時,也就是使用迭代器的foreach迴圈開始乙個新迴圈時,**會恢復執行。
ienumerator介面官方文件:
C foreach迴圈例項詳解
在編寫c 時,我們會發現使用foreach迴圈會比使用for迴圈方便,不需要進行資料型別的強制轉換,不需要使用下標 通過幫助文件的檢視可知,如果要對乙個物件使用foreach進行迴圈的話則此物件的型別必須擁有getenumerator方法,此方法是在ienumerable介面下的,但是否實現此介面無...
運用c foreach迴圈顯示
慣例 我是溫浩然 先說一下兩種的區別,上圖,改版之前。後來的效果是 很明顯的,後來的是分組織結構顯示的,這裡用到的技術,就是c標籤 先貼 foreach中巢狀if其中再巢狀foreach。後台傳到前台的是babystages這個list集合,在前台中,通過c foreach來進行迴圈解析,就會生出第...
c foreach遍歷迴圈List
在jsp中如何用jstl的c foreach遍歷元素是map型別的list?request中有個 admin.dealers 屬性,是個元素是map型別的list,其傎如下所示 在jsp中如何用jstl的c foreach遍歷所有的dealerid與dealername?解決方案 遍歷的物件實際上是...