在"c#中list是怎麼存放元素的"中,分析了list的原始碼,了解了list是如何存放元素的。這次,就自定義乙個泛型集合型別,可實現新增元素,並支援遍歷。
該泛型集合型別一定需要乙個新增元素的方法,在新增元素的時候需要考慮:當新增的元素超過當前陣列的容量,就讓陣列擴容;為了支援迴圈遍歷,該泛型集合型別必須提供乙個迭代器(實現ienumerator介面)。
publicclass mylist
public ienumeratorgetenumerator()
class myenumeraor : ienumerator
public t current
return _mylist.items[index];
}
}
publicvoid dispose()
object system.collections.ienumerator.current
}
publicbool movenext()
publicvoid reset()
}
}○ 泛型集合型別維護著乙個t型別的泛型陣列
○ 私有欄位count是用來計數的,每新增乙個元素計數加1
○ 新增方法考慮了當count計數等於當前元素的長度,就讓陣列擴容為當前的2倍
○ 迭代器實現了ienumerator介面
客戶端呼叫。
class program
console.readkey();
}
}另外,ienumerable和ienumerator的區別是什麼呢?
其實,真正執行迭代的是ienumerator迭代器。ienumerable介面就提供了乙個方法,就是返回ienumerator迭代器。
public如果按照曾向秋的方式在客戶端呼叫,輸出的結果是0,不是1,顯然不是我們所期望的。之所以不是1是因為:當呼叫list.getenumerator()的時候,就會呼叫myenumeraor類的建構函式,而我們沒有在建構函式中讓集合的指標自增1。inte***ce ienumerable
public myenumeraor(mylistmylist)現在,我們需要在myenumeraor類的建構函式,讓集合的指標自增1,並且需要把index變數作為靜態字段放在mylist類下。
publicclass mylist: ienumerable
public ienumeratorgetenumerator()
class myenumeraor : ienumerator
public t current
return _mylist.items[index];
}
}
publicvoid dispose()
object ienumerator.current
}
publicbool movenext()
publicvoid reset()
}
ienumerator ienumerable.getenumerator()
}然後,客戶端就可以想像曾向秋所說的那樣呼叫了。
staticvoid main(string args)
利用泛型自己定義乙個簡單的集合
package com.fanxing author 魯志明 e mail 13688601037 139.com public class collection public void add type type public type get int index public int size ...
用泛型實現乙個堆疊類
在linkedstack類中定義了乙個node靜態內部類,根據類載入機制,node類會在linkedstack初始化時被載入。public class linkedstack node t item,node next boolean end 棧頂元素 private node top newnod...
自己寫乙個簡易的string型別
c語言中沒有string型別,於是,在使用c語言的時候,總會用char 型別來替代string型別,但是char 和string型別還是有一定的不同的。最大的差異就是在對字串的操作上。顯然 比起char string對於字串的操作更加的簡便,比如說 1.兩個string類的變數str1和str2,我...