對於實體層,在學習三層架構的時候,我們大家都接觸過,並且在之後的項目中也運用過,我們也知道,在層和層之間傳遞的是實體或者是實體集合,那麼,在這裡問一下大家,你們是如何構建自己的實體集的呢?是通過數組,是通過系統提供的集合,或者是自己針對於每個實體都創建一個自己的集合(每個集合和都是一個套代碼),還是其它的方法。
本片博客,本人會通過實例向大家闡釋兩種方式,這兩種方式都是創建自己的實體集合類,但是,這兩種方式也是非常不一樣的。
該方式是為每一個實體類創建一個實體集合類,並且,每個實體集合類裡面的功能是一樣的,那麼,每個實體集合類的不同之處是什麼呢?他們的不同之處就是,他們具體的服務對象的類型是固定的。下面是一個實例,大家可以看一下。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using 集合.集合.靈活性差的ORMapping; namespace TableToCollection.實體 { public class Person { public string strID { get; set; } public string strName { get; set; } public int intAge { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using TableToCollection.實體; namespace TableToCollection.集合.靈活性差的集合 { public class PersonCollection_bad:IEnumerable { private ArrayList list; public int Count { get { return list.Count; } } #region 構造函數 public PersonCollection_bad() { list = new ArrayList(); } #endregion #region 添加 public void Add(Person p) { this.list.Add(p); } public void AddAr(Person[] ps) { this.list.AddRange(ps); } #endregion #region 刪除 public void Remove(Person p) { this.list.Remove(p); } public void RemoveAt(int index) { this.list.RemoveAt(index); } public void RemoveRange(int index, int count) { this.list.RemoveRange(index, count); } public void Clear() { this.list.Clear(); } #endregion #region 自定義索引器 public Object this[int index] { get { return list[index]; } set { list[index] = value; } } #endregion #region 支持foreach語句遍歷 public IEnumerator GetEnumerator() { return list.GetEnumerator(); } #endregion } }
對於上面實體集合類的缺點,我們通過泛型的方式解決,也就是類型後綁定的方式。具體思路,創建一個基礎實體集合類,然後,將具體集合類繼承這個類,並且指定相應的類型,從而達到代碼的復用性號,程序的安全性號的目的。實體類使用上面的實體類。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 集合.集合.靈活性好的集合 { public class BaseCollection:IEnumerable ,IEnumerator ,IList { private List list; //定義索引 private int position; public int Count { get { if (list != null) { return list.Count; } return -1; } } /// /// 確定集合中特定對象的索引 /// /// 特定的對象 ///如果在列表中找到,則為item 的索引;否則為 -1 public int IndexOf(T TObject) { return this.list.IndexOf(TObject); } #region 構造方法 public BaseCollection(){ this.list = new List(); this.position = -1; } #endregion #region 添加 /// /// 將對象添加到集合的尾部 /// /// 要添加到集合尾部的對象 public void Add(T TObject) { this.list.Add(TObject); } ////// 將指定集合裡的元素添加到集合尾部 /// /// 要添加到集合尾部的集合對象 public void AddRange(ICollectionTCollection) { this.list.AddRange(TCollection); } #endregion #region 刪除 /// /// 從集合中移除特定對象的第一個匹配項 /// /// TObject ///true:移除成功;false:移除失敗 public bool Remove(T TObject) { return this.list.Remove(TObject); } ////// 從集合中移除指定索引處的對象 /// /// 索引值,從0開始 public void RemoveAt(int index) { this.list.RemoveAt(index); } ////// 集合刪除所有對象 /// public void Clear() { this.list.Clear(); } #endregion #region 插入 ////// 在集合的特定位置插入對象 /// /// 索引,從0開始 /// 被插入的對象 public void Insert(int index, T TObject) { this.list.Insert(index, TObject); } #endregion #region 取值 ////// 獲取或設置指定索引處的元素 /// /// 索引值從0開始 ///TObject public T this[int index] { get { return this.list[index]; } set { this.list[index] = value; } } #endregion #region 實現ICollection,因為IList 繼承ICollection //獲取一個值,該值指示 System.Collections.Generic.ICollection 是否為只讀。 public bool IsReadOnly { get { return true; } } //確定 System.Collections.Generic.ICollection 是否包含特定值。 public bool Contains(T item) { return this.list.Contains(item); } //從特定的 System.Array 索引處開始,將 System.Collections.Generic.ICollection 的元素復制到一個 public void CopyTo(T[] array, int arrayIndex) { this.list.CopyTo(array, arrayIndex); } #endregion #region 支持foreach語句遍歷 #region 實現IEnumerable 接口 System.Collections.Generic.IEnumerator System.Collections.Generic.IEnumerable .GetEnumerator() { return (System.Collections.Generic.IEnumerator )this; } #region 實現IEnumerable接口,因為IEnumerable 繼承IEnumerable System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)this; } #endregion #endregion #region 實現IEnumerator 接口 //獲取集合中的當前元素。 T System.Collections.Generic.IEnumerator .Current { get { try { return this.list[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } #region 實現IEnumerator接口,因為IEnumerator 繼承IEnumerator //獲取集合中的當前元素。 object System.Collections.IEnumerator.Current { get { try { return this.list[position]; } catch (IndexOutOfRangeException) { throw new InvalidOperationException(); } } } //將枚舉數推進到集合的下一個元素。 bool System.Collections.IEnumerator.MoveNext() { this.position++; return (this.position < this.list.Count); } //將枚舉數設置為其初始位置,該位置位於集合中第一個元素之前。 void System.Collections.IEnumerator.Reset() { this.position = -1; } #endregion #region 實現IDisposable接口,因為IEnumerator 繼承IDisposable public void Dispose() { this.position = -1; } #endregion #endregion #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using TableToCollection.實體; namespace 集合.集合.靈活性好的集合 { public class PersonBaseCollection:BaseCollection{ } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using TableToCollection.實體; using TableToCollection.集合.靈活性差的集合; using 集合.集合.靈活性好的集合; using 集合.靈活性差的ORMapping.ORMapping; namespace 集合 { class Program { static void Main(string[] args) { #region 靈活性差的集合 //#region 靈活性差的集合 //PersonCollection_bad personCollection = new PersonCollection_bad(); ////集合添加元素 //for (int i = 0; i < 10; i++) //{ // Person p = new Person() { strID=i.ToString(),strName="zhang",intAge=i}; // personCollection.Add(p); //} //Console.WriteLine("元素個數:"+personCollection.Count); ////輸出集合 //Console.WriteLine("使用foreach輸出"); //foreach (var item in personCollection) //{ // Console.WriteLine(((Person)item).strID + ((Person)item).strName + ((Person)item).intAge); //} //Console.WriteLine("使用for輸出"); //for (int i = 0; i < personCollection.Count; i++) //{ // Console.WriteLine(((Person)personCollection[i]).strID + ((Person)personCollection[i]).strName + ((Person)personCollection[i]).intAge); //} //#endregion #endregion #region 靈活性好的集合 PersonBaseCollection personBaseCollection = new PersonBaseCollection(); DoAdd(personBaseCollection); DoForPrint(personBaseCollection); DoInsert(0,personBaseCollection); DoForEachPrint(personBaseCollection); personBaseCollection.RemoveAt(1); DoForEachPrint(personBaseCollection); personBaseCollection.Clear(); DoForEachPrint(personBaseCollection); #endregion Console.ReadKey(); } static void DoAdd(PersonBaseCollection personBaseCollection) { personBaseCollection.Add(new Person() { strID = "1", strName = "qs1(Add)", intAge = 21 }); Person[] persons = { new Person() { strID = "2", strName = "qs2(AddRange)", intAge = 22 }, new Person() { strID = "3", strName = "qs3(AddRange)", intAge = 23 } }; personBaseCollection.AddRange(persons); } static void DoInsert(int index, PersonBaseCollection personBaseCollection) { personBaseCollection.Insert(index, new Person() { strID = "4", strName = "qs4(Insert)", intAge = 24 }); } static void DoForPrint(PersonBaseCollection personBaseCollection) { Console.WriteLine("For語句輸出:"); if (personBaseCollection.Count == 0) { Console.WriteLine("集合裡面沒有元素!"); return; } for (int i = 0; i < personBaseCollection.Count; i++) { Console.WriteLine(personBaseCollection[i].strID + " " + personBaseCollection[i].strName + " " + personBaseCollection[i].intAge); } } static void DoForEachPrint(PersonBaseCollection personBaseCollection) { Console.WriteLine("ForEach語句輸出:"); if (personBaseCollection.Count == 0) { Console.WriteLine("集合裡面沒有元素!"); return; } foreach (var item in personBaseCollection) { Console.WriteLine(item.strID +" "+ item.strName +" "+ item.intAge); } } } }
上面說的內容中還有一塊沒有說,就是迭代器設計模式,其實上面的程序中已經運用了,只不過相應的接口是微軟給定義好的,為什麼微軟給定義好了的呢?因為微軟自己也要用(.net framework提供的具體集合類)。