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
介面,其中包括current
和movenext
。可以採取和平常一樣的方式呼叫迭代器生成的列舉器:
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...