標籤:style blog color 資料 io for
小弟初寫博文,深感“易敲千行碼,難下百餘文”的道理。
內容粗略淺薄,望各位大神海涵!
- 動態數組ArrayList可以實現不斷的增長,讓我們感受到了在某些地方較數組有優越感。但它包含的數群組類型是object類,意味著需要轉為數組時,存在拆裝箱操作,這帶來不必要的麻煩,也損失了效能。而List<T>泛型集合的出現便大大解決了上述問題。
//泛型 --泛指某一個類型。這種類型需要使用者自己確定 List<string> lists = new List<string>(); //添加元素 lists.Add("aa"); lists.Add("bb"); //遍曆元素時不用轉換類型
foreach (string item in lists) { Console.WriteLine(item); } lists[0] = "abcde"; lists.RemoveAt(0); for (int i = 0; i < lists.Count; i++) { Console.WriteLine(lists[i]); } Console.ReadKey();
- 泛型集合在建立的時候就要求指定類型,所以在遍曆集合或轉數組時,直接就是資料的原有類型。其實我們也可以自己寫個類似的類實現泛型集合的準系統。
//類的參數一般就是指型別參數 class MyList<T>: { T[] items=new T[4]; int count; // 集合中元素個數 public int Count { get { return count; } //set { count = value; } } // 添加元素 public void Add(T value) { if (this.Count == items.Length) { T[] newItems = new T[items.Length * 2]; items.CopyTo(newItems, 0); items = newItems; } items[count] = value; count++; } // 索引器 public T this[int index] { get { if (index < 0 || index >= this.Count) { throw new ArgumentOutOfRangeException("no"); } return items[index]; } set { if (index < 0 || index >= this.Count) { throw new ArgumentOutOfRangeException("no"); } items[index] = value; } }
- 泛型直接通過<T>把元素的類型指定了,添加刪除元素和動態數組類似。但是當我們用foreach遍曆的時候,出問題了:
錯誤:“泛型的實現.MyList<int>”不包含“GetEnumerator”的公用定義,
因此 foreach 語句不能作用於“泛型的實現.MyList<int>”類型的變數。
- 不包含GetEnumerator的公用定義?難道是要實現一個介面?通過反編譯器查到 LIST<T>真的實現了名為“IEnumerable”的介面。
public interface IEnumerable { [DispId(-4), __DynamicallyInvokable] IEnumerator GetEnumerator(); }
- 那我們就實現“IEnumerable”這個介面吧,再看IEnumerator,是一個介面對象,原來GetEnumerator()要求返回一個"IEnumerator"的介面對象。糾結了,哪裡有這個對象啊。找不到,那我們自己寫個類來實現這個介面,不就ok了。
class MyEnumerator<T> : IEnumerator { T[] items; //類型的數組 int num; //數組有效長度 int index = -1; //迭代指標預設在-1的位置 //建構函式, public MyEnumerator(T[] items, int num) { this.items = items; this.num = num; } //擷取當前元素的值 public object Current { get { return items[index]; } } //先判斷有沒有下一個元素,如果有就將枚舉數推進到下一個元素 public bool MoveNext() { index++; if (index >= num) { return false; } return true; } #endregion // 迭代重設 public void Reset() { index = -1; } }
- 原來IEnumerator介面就是為了實現迭代功能的,foreach遍曆的時候並不直接指向第0個元素,就像位置是在-1一樣,先來判斷有沒有第0個元素,沒有直接返回false,有則指標移到第0,再執行讀取。有了實現IEnumerator的類,就可以new一個MyEnumerator<T>對象來return了。
//IEnumerable 成員--實現迭代 public IEnumerator GetEnumerator() { //你必須得返回一個實現了IEnumerator介面的類對象 return new MyEnumerator<T>(items, Count); }
- 現在,MyList<T>也擁有List<T>的準系統了哦,當然泛型還有很多其他的功能和特性,還有待我們去細細研究了。