通過Lua迭代器自定義實現(xiàn)對c#集合的遍歷

在c#中定義的集合是沒法在lua中用for ..in ipairs()這種方法來遍歷的九杂,下面介紹一個自定義的實現(xiàn)來實現(xiàn)

Lua 迭代器

迭代器(iterator)是一種對象剪决,它能夠用來遍歷標準模板庫容器中的部分或全部元素梢薪,每個迭代器對象代表容器中的確定的地址耻讽。

在 Lua 中迭代器是一種支持指針類型的結構有决,它可以遍歷集合的每一個元素

無狀態(tài)的迭代器

無狀態(tài)的迭代器是指不保留任何狀態(tài)的迭代器拼余,因此在循環(huán)中我們可以利用無狀態(tài)迭代器避免創(chuàng)建閉包花費額外的代價污桦。

每一次迭代,迭代函數(shù)都是用兩個變量(狀態(tài)常量和控制變量)的值作為參數(shù)被調(diào)用匙监,一個無狀態(tài)的迭代器只利用這兩個值可以獲取下一個元素凡橱。

這種無狀態(tài)迭代器的典型的簡單的例子是 ipairs,它遍歷數(shù)組的每一個元素亭姥。

以下實例我們使用了一個簡單的函數(shù)來實現(xiàn)迭代器稼钩,實現(xiàn) 數(shù)字 n 的平方:

function?square(iteratorMaxCount,currentNumber)

? ?if?currentNumber<iteratorMaxCount

? ?then

currentNumber?=?currentNumber+1

? ?return?currentNumber,?currentNumber*currentNumber

? ?end

end

for?i,n?in?square,3,0

do

? ?print(i,n)

end

多狀態(tài)的迭代器

很多情況下,迭代器需要保存多個狀態(tài)信息而不是簡單的狀態(tài)常量和控制變量达罗,最簡單的方法是使用閉包坝撑,還有一種方法就是將所有的狀態(tài)信息封裝到 table 內(nèi),將 table 作為迭代器的狀態(tài)常量粮揉,因為這種情況下可以將所有的信息存放在 table 內(nèi)巡李,所以迭代函數(shù)通常不需要第二個參數(shù)

如下,自定義實現(xiàn)一個ipairs一樣功能的迭代器

function kpairs(t)

? ? local index = 0

? ? local count = #t


? ? return function ()

? ? ? ? index = index + 1

? ? ? ? if index <= count then

? ? ? ? ? ? local v = t[index]

? ? ? ? ? ? if v then

? ? ? ? ? ? ? ? return index, v

? ? ? ? ? ? else

? ? ? ? ? ? ? ? return nil

? ? ? ? ? ? end

? ? ? ? end

? end

end

for i, v in kpairs(a) do

? ? print(string.format("%s=%s", i, tostring(v)))

end

如果不判斷空的話扶认,上例將輸出所有元素侨拦,包括nil,而我們知道ipairs是遇到nil就認為遍歷結束了

有了這些基礎之后,再來看怎么自定義一個遍歷c#集合的迭代器辐宾,假設list在c#中是這樣申明的

class MyItem{

? ? public string name;

? ? public int value;

}

var list = new List<MyItem>();

function xpairs(list)

? ? if list then

? ? ? ? local iter = list:GetEnumerator()

? ? ? ? return function()

? ? ? ? ? ? if iter:MoveNext() then

? ? ? ? ? ? ? ? return iter.Current

? ? ? ? ? ? else

? ? ? ? ? ? ? ? iter:Dispose()

? ? ? ? ? ? ? ? return nil

? ? ? ? ? ? end

? ? ? ? end

? ? end

? ? return nil

end

則用法如下

for item in xpairs(list) do

? ? print(string.format("name=%s, value=%s", item.name, item.value))

end

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狱从,一起剝皮案震驚了整個濱河市膨蛮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季研,老刑警劉巖敞葛,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異训貌,居然都是意外死亡制肮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門递沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豺鼻,“玉大人,你說我怎么就攤上這事款慨∪屐” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵檩奠,是天一觀的道長桩了。 經(jīng)常有香客問我,道長埠戳,這世上最難降的妖魔是什么井誉? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮整胃,結果婚禮上颗圣,老公的妹妹穿的比我還像新娘。我一直安慰自己屁使,他們只是感情好在岂,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛮寂,像睡著了一般蔽午。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酬蹋,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天及老,我揣著相機與錄音,去河邊找鬼范抓。 笑死写半,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的尉咕。 我是一名探鬼主播叠蝇,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悔捶?” 一聲冷哼從身側響起铃慷,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕该,沒想到半個月后犁柜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡堂淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年馋缅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绢淀。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡萤悴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皆的,到底是詐尸還是另有隱情覆履,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布费薄,位于F島的核電站硝全,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楞抡。R本人自食惡果不足惜伟众,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望召廷。 院中可真熱鬧赂鲤,春花似錦、人聲如沸柱恤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梗顺。三九已至,卻和暖如春车摄,著一層夾襖步出監(jiān)牢的瞬間寺谤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工吮播, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留变屁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓意狠,卻偏偏與公主長得像粟关,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子环戈,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容