對於實體層,在學習三層架構的時候,我們大家都接觸過,並且在之後的項目中也運用過,我們也知道,在層和層之間傳遞的是實體或者是實體集合,那麼,在這裡問一下大家,你們是如何構建自己的實體集的呢?是通過數組,是通過系統提供的集合,或者是自己針對於每個實體都創建一個自己的集合(每個集合和都是一個套代碼),還是其它的方法。
本片博客,本人會通過實例向大家闡釋兩種方式,這兩種方式都是創建自己的實體集合類,但是,這兩種方式也是非常不一樣的。
該方式是為每一個實體類創建一個實體集合類,並且,每個實體集合類裡面的功能是一樣的,那麼,每個實體集合類的不同之處是什麼呢?他們的不同之處就是,他們具體的服務對象的類型是固定的。下面是一個實例,大家可以看一下。
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(ICollection TCollection)
{
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提供的具體集合類)。