visual C (十九)列舉集合

2021-10-05 23:54:37 字數 4337 閱讀 6758

19.2 用迭代器實現列舉器

我們前面用foreach語句來方便的遍歷集合,實際上foreach語句只能遍歷可列舉集合,就是實現了system.collections.ienumerable介面的集合。ienumerable介面中包含乙個名為getenumerator的方法,返回實現該介面的列舉器物件。列舉器物件用於遍歷集合中的元素。ienumerator介面指定了一下屬性和方法:

object current

bool

movenext()

;void

reset()

;

將列舉器看成指標,最開始指向第乙個元素之前的位置,然後呼叫movenext方法,指標成功移動到下一項則返回true,否則返回false。用current訪問當前指向的那一項,用reset方法使指標返回到第一項的前一項位置。這樣用集合的getenmerator方法建立列舉器,然後反覆呼叫movenext,獲取current的值,這個過程正是foreach語句 做的事情。當然類庫也提供了泛型ienumerable介面。

在vs中新建乙個控制台應用程式,新增乙個原始檔為第17章的二叉樹類tree.cs,然後我們建立乙個treeenumerator.cs

using system;

using system.collections;

using system.collections.generic;

using system.text;

namespace c_19_1_1

}object ienumerator.current =

>

throw

newnotimplementedexception()

;public

treeenumerator

(tree data)

private

void

populate

(queue enumqueue, tree tree)

bool ienumerator.

movenext()

if(this

.enumdata.count >0)

return

false;}

void ienumerator.

reset()

#region idisposable support

private

bool disposedvalue =

false

;// 要檢測冗餘呼叫

protected

virtual

void

dispose

(bool disposing)

// todo: 釋放未託管的資源(未託管的物件)並在以下內容中替代終結器。

// todo: 將大型字段設定為 null。

disposedvalue =

true;}

}// todo: 僅當以上 dispose(bool disposing) 擁有用於釋放未託管資源的**時才替代終結器。

// ~treeenumerator()

// // 新增此**以正確實現可處置模式。

void idisposable.

dispose()

#endregion

}}

生成解決方案,成功就說明程式沒有明顯的語法錯誤。

將原始檔tree.cs中的**稍作修改:

using system;

using system.collections;

using system.collections.generic;

using system.text;

namespace c_19_1_1

public tree lefttree

public tree righttree

public

tree

(titem nodevalue)

public

void

insert

(titem newitem)

public

string

walktree()

";if(

this

.righttree !=

null

) result +

=this

.righttree.

walktree()

;return result;

} ienumerator ienumerable

.getenumerator()

ienumerator ienumerable.

getenumerator()

}}

program.cs中測試列舉器:

using system;

namespace c_19_1_1}}

}

執行結果:

-12-

8055

1010

1114

151\c_19_1_1.exe (程序 26196

)已退出,**為 0。

按任意鍵關閉此視窗.

..

迭代器是能生成已排序值序列的乙個**塊。

class

basiccollection

ienumerable

} ienumerator

.ienumerable

.getenumerator()

}ienumerator ienumerable.

getenumerator()

}

yield的使用很關鍵,它指定每一次迭代要返回的值。getenumerator方法中的**定義了乙個迭代器。編譯器利用這些**實現ienumerator介面,其中包括currentmovenext。可以採取和平常一樣的方式呼叫迭代器生成的列舉器:

basiccollection<

string

>bc=

newbasiccollection

<

string

>()

;bc.

filllist

("twas"

,"bring"

,"and"

,"the"

,"slithy"

,"toves");

foreach

(string word in bc)

還可以通過附加屬性實現按相反順序獲取資料:

class

basiccollection

:ienumerable}}

}

呼叫該屬性:

basiccollection<

string

> bc=

newbasiccollection

<

string

>()

;bc.

filllist

("twas"

,"bring"

,"and"

,"the"

,"the"

,"slithy"

,"toves");

foreach

(string word in bc.reverse)

console.

writeline

(word)

;

回到我們前面的程式,將tree.cs中的ienumerable.getenumerator方法改為:

ienumerator ienumerable

.getenumerator()

然後其它的都不變,執行一下發現能正常執行。

mysql 列舉與集合 mysql列舉和集合型別

列舉和集合型別 列舉 enum 型別,最多可以定義 65535 種不同的字串從中做出選擇,只能並且必須選擇其中一種,占用儲存空間是乙個或兩個位元組,由列舉值的數目決定 集合 set 型別,最多可以有 64 個成員,可以選擇其中的零個到不限定的多個,占用儲存空間是乙個到八個位元組,由集合可能的成員數目...

列舉集合所有子集。

列舉集合所有子集。包括空集與該集合本身,共2的n次方個。列舉集合所有子集。包括空集與該集合本身,共2的n次方個。include include using namespace std template void print elements t array,unsigned int count,un...

列舉轉List集合

列舉類轉list集合,將列舉名稱和列舉值新增到list集合裡,在網上看了很多都沒有啥完整的方法,後來自己琢磨了一下想了個簡單的方法,貼出來助人為樂,上 後台 獲取列舉值轉list集合 這個model是自定義的乙個類 放了兩個字段,乙個列舉值 乙個列舉名稱 ilistenummodellist new...