c foreach迴圈研究及迭代器

2021-10-04 14:58:25 字數 2106 閱讀 7176

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?解決方案 遍歷的物件實際上是...