目錄 問題起源於本人的乙個練手的撲克牌程式:洗完牌之後要發給場上的三人。
只發給單個人的時候用 foreach 迴圈一下就好了,但三個人就有點麻煩了。
牌組用list儲存你可能會想到這樣寫:
for (int i = 0; i < precard.count; i++)
或者這樣寫
int i = 0;
dowhile (i < precard.count);
但如果還想使用類似迭代器的方法,那麼可以使用 getenumerator(),因為我們知道 foreach 裡面實際上就是呼叫了這個方法。
所以我們還可以直接呼叫 getenumerator 和 movenext 來進行迭代:
ienumerator ie = precard.getenumerator();
while(ie.movenext())
如果是直接把上面的**搬過來,會發現add方法那裡會報錯,需要提供兩個引數,鍵和值。
難道必須要對得到的 ienumerator 再用一次 getenumerator?
實際上大可不必,因為針對這種鍵值對,我們有乙個玩意叫做 idictionaryenumerator。看名字就知道它就是為此而生的。
idictionaryenumerator ie = dict.getenumerator();
while(ie.movenext())
至此我們通過寫手動擋的 foreach ,成功的實現了可迭代物件間的賦值。
在c#中 foreach 語句,能夠進行比for迴圈語句更直接和簡單的對集合的迭代,編譯器會將 foreach 編譯來呼叫 getenumerator 和 movenext方法以及current屬性。
實際上 foreach 語句編譯之後也會產生類似於上面所寫的**。實際上這幅圖可以比較清楚的說明一切。
其實前面的做法都是捨近求遠....
我一開始寫的時候,覺得那樣做還挺好的。甚至還自信滿滿的點了傳送到首頁[捂臉]
然後....當然是馬上就被撤了。我當然是不服的(聲音減弱),於是就發郵件詢問。
結果當然就是被管理員教育了,其實管理員挺耐心,教會了我很多。(隔著螢幕我也不知道對面想不想順著網線打我)
如果你還想保留原來的集合的話,那麼用上面的方法是可行的,如果不想的話,那麼像下面那樣使用linq
會更好。
var precard = new queue() ;
precard.enqueue("03a");
precard.enqueue("03b");
precard.enqueue("03c");
precard.enqueue("03d");
precard.enqueue("04a");
precard.enqueue("04b");
var players = new list>
;while (precard.count > 0)
players.foreach(p =>
);
對於字典,可以使用keyvaluepair
:
var precard = new queue>(
new dictionary,,,,,
});var players = new list>>
;while (precard.count > 0)
players.foreach(p =>
);
可能各位早會這樣弄了,讓各位進來實在是不好意思了。
最後說一句,linq真好用!
如何實現可迭代物件和迭代器物件 二
之前我們介紹了可迭代物件和迭代器物件,現在我們就實現這兩個物件,滿足實際案例中的需求,解決方案如下 實現乙個迭代器物件weatheriterator,next方法每次返回乙個城市的氣溫 實現乙個可迭代物件weatheriterable,iter 方法返回乙個迭代器物件。如下 coding utf 8...
問題8 9 如何實現可迭代物件和迭代器物件
一 通過可迭代物件和python內建函式iter 得到迭代器 即,iter 可迭代物件 得到乙個迭代器 例 list 1 1,2,3,4,5 1 iter 物件 若此物件想滿足迭代要求,其內部要有迭代介面或者乙個序列 iter 或者 getitm 2 迭代器只有乙個介面 next 呼叫next 時會...
Python的可迭代物件和迭代器物件
迭代器指的是迭代取值的工具,迭代是指乙個重複的過程,每一次重複都是基於上一次結果而來,迭代提供了一種通用的不依賴索引的迭代取值方式 但凡內建有 iter 方法的物件,都稱為可迭代物件,可迭代的物件 str,list,tuple,dict,set,檔案物件 1.既內建又 next 方法的物件,執行該方...