在"C#中List<T>是怎麼存放元素的"中,分析了List<T>的源碼,了解了List<T>是如何存放元素的。這次,就自定義一個泛型集合類型,可實現添加元素,並支持遍歷。
該泛型集合類型一定需要一個添加元素的方法,在添加元素的時候需要考慮:當添加的元素超過當前數組的容量,就讓數組擴容;為了支持循環遍歷,該泛型集合類型必須提供一個迭代器(實現IEnumerator接口)。
public class MyList<T>{T[] items = new T[5];private int count;public void Add(T item){if(count == items.Length)Array.Resize(ref items, items.Length * 2);items[count++] = item;}public IEnumerator<T> GetEnumerator(){return new MyEnumeraor(this);}class MyEnumeraor : IEnumerator<T>{private int index = -1;private MyList<T> _myList;public MyEnumeraor(MyList<T> myList){_myList = myList;}public T Current{get{if (index < 0 || index >= _myList.count){return default(T);}return _myList.items[index];}}public void Dispose(){}object System.Collections.IEnumerator.Current{get { return Current; }}public bool MoveNext(){return ++index < _myList.count;}public void Reset(){index = -1;}}}
○ 泛型集合類型維護著一個T類型的泛型數組
○ 私有字段count是用來計數的,每添加一個元素計數加1
○ 添加方法考慮了當count計數等於當前元素的長度,就讓數組擴容為當前的2倍
○ 迭代器實現了IEnumerator<T>接口
客戶端調用。
class Program{static void Main(string[] args){MyList<int> list = new MyList<int>();list.Add(1);list.Add(2);foreach (int item in list){Console.WriteLine(item);}Console.ReadKey();}}
另外,IEnumerable和IEnumerator的區別是什麼呢?
其實,真正執行迭代的是IEnumerator迭代器。IEnumerable接口就提供了一個方法,就是返回IEnumerator迭代器。
public interface IEnumerable{IEnumerator GetEnumerator();}
你好,你的問題只能是遍歷集合了:
假設list2為B的泛型集合
參考代碼:
foreach(A a1 in list1){
B b1 = new B();
b1.a=a1.a;
//根據bcd不同值給b1中所有字段
b1.e=a1.e;
list2.add(b1);
}
有三種
很簡單,給你舉個例子:
1、先聲明一個Dictoinary<key,value>泛型集合
創建一個Student類的對象Student stu=new Student()(在這個類中
有一個name屬性)
Dictionary<student.name,Student> students=new Dictionary<student.name,Student>();
students.Add(stu);
2、開始遍歷
(1)可以用value遍歷就是Stuent的 對象
foreach(Student stu in students.values)
{}
(2)也可以用key遍歷 即student.name
foreach(string key in students.keys)
{}
3、另外list<T>泛型集合也同樣的道理,只不過,
它遍歷時要通過索引
例如
list<Student> stu=new list<Student>();
stu(1).name;
希望你能明白