自己寫乙個泛型集合型別,可實現新增和遍歷

2021-09-07 22:35:36 字數 2310 閱讀 3493

在"c#中list是怎麼存放元素的"中,分析了list的原始碼,了解了list是如何存放元素的。這次,就自定義乙個泛型集合型別,可實現新增元素,並支援遍歷。

該泛型集合型別一定需要乙個新增元素的方法,在新增元素的時候需要考慮:當新增的元素超過當前陣列的容量,就讓陣列擴容;為了支援迴圈遍歷,該泛型集合型別必須提供乙個迭代器(實現ienumerator介面)。

public

class mylist

public ienumeratorgetenumerator()
class myenumeraor : ienumerator
public t current
return _mylist.items[index];
}
}
public

void dispose()

object system.collections.ienumerator.current
}
public

bool movenext()

public

void reset()

}
}
○ 泛型集合型別維護著乙個t型別的泛型陣列

○ 私有欄位count是用來計數的,每新增乙個元素計數加1

○ 新增方法考慮了當count計數等於當前元素的長度,就讓陣列擴容為當前的2倍

○ 迭代器實現了ienumerator介面

客戶端呼叫。

class program
console.readkey();
}
}
另外,ienumerable和ienumerator的區別是什麼呢?

其實,真正執行迭代的是ienumerator迭代器。ienumerable介面就提供了乙個方法,就是返回ienumerator迭代器。

public

inte***ce ienumerable

如果按照曾向秋的方式在客戶端呼叫,輸出的結果是0,不是1,顯然不是我們所期望的。之所以不是1是因為:當呼叫list.getenumerator()的時候,就會呼叫myenumeraor類的建構函式,而我們沒有在建構函式中讓集合的指標自增1。

public myenumeraor(mylistmylist)
現在,我們需要在myenumeraor類的建構函式,讓集合的指標自增1,並且需要把index變數作為靜態字段放在mylist類下。

public

class mylist: ienumerable

public ienumeratorgetenumerator()
class myenumeraor : ienumerator
public t current
return _mylist.items[index];
}
}
public

void dispose()

object ienumerator.current
}
public

bool movenext()

public

void reset()

}
ienumerator ienumerable.getenumerator()
}
然後,客戶端就可以想像曾向秋所說的那樣呼叫了。

static

void 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,我...