摘要:C# - 實作 Strongly Typed Custom Collections
本篇主要是實作 Strongly Typed Custom Collections,這種方式其實早在 .Net Framework 1.0 的時代就已經存在,在 1.0 時代大多都是以繼承「CollectionBase」的寫法為主。之後隨著進入 .Net Framework 2.0 又有繼承「IList」或者「IEnumerable」等等的寫法。以下就來寫個簡單的 Sample 來實作...
步驟一:開個新的 WinForm 專案,並且將畫面佈置一下
步驟二:在專案中建立一個名為「MyRecord」的類別
Code:
using System.Collections;
namespace WindowsFormsApplication1
{
public class MyRecord
{
private string _Key;
private string _FirstName;
private string _LastName;
private string _Gender;
public MyRecord()
{
}
public MyRecord(string p_Key, string p_FirstName, string p_LastName, string p_Gender)
{
_Key = p_Key;
_FirstName = p_FirstName;
_LastName = p_LastName;
_Gender = p_Gender;
}
public string Key
{
get { return _Key; }
set { _Key = value; }
}
public string FirstName
{
get { return _FirstName; }
set { _FirstName = value; }
}
public string LastName
{
get { return _LastName; }
set { _LastName = value; }
}
public string Gender
{
get { return _Gender; }
set { _Gender = value; }
}
public override string ToString()
{
return string.Format("{0} {1}:{2}", _FirstName, _LastName, _Gender);
}
}
}
步驟三:在專案中建立一個名為「MyRecords」的類別,這個類別一個「Strongly Typed Custom Collections」
Code:
using System.Collections;
namespace WindowsFormsApplication1
{
public class MyRecords : CollectionBase
{
public MyRecords()
{
}
public MyRecord this[int index]
{
get
{
return (MyRecord)this.List[index];
}
set
{
this.List[index] = value;
}
}
public MyRecord this[string Key]
{
get
{
MyRecord _Result = null;
foreach (MyRecord item in this.List)
{
if (item.Key.Equals(Key))
{
_Result = item;
break;
}
}
return _Result;
}
}
public int IndexOf(MyRecord item)
{
return base.List.IndexOf(item);
}
public int Add(MyRecord item)
{
foreach (MyRecord item1 in this.List)
{
if (item1.Key == item.Key) throw new Exception("Key 值重複!!!");
}
return this.List.Add(item);
}
public void Remove(MyRecord item)
{
this.InnerList.Remove(item);
}
public void CopyTo(Array array, int index)
{
this.List.CopyTo(array, index);
}
public void AddRange(MyRecords collection)
{
for (int i = 0; i < collection.Count; i++)
{
this.List.Add(collection[i]);
}
}
public void AddRange(MyRecord[] collection)
{
this.AddRange(collection);
}
public bool Contains(MyRecord item)
{
return this.List.Contains(item);
}
public void Insert(int index, MyRecord item)
{
foreach (MyRecord item1 in this.List)
{
if (item1.Key == item.Key) throw new Exception("Key 值重複!!!");
}
this.List.Insert(index, item);
}
}
}
步驟四:在 WinForm 來使用「Strongly Typed Custom Collections」
Code:
namespace WindowsFormsApplication1
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyRecord myRec = new MyRecord();
myRec.FirstName = "小呆";
myRec.LastName = "張";
myRec.Gender = "男";
MessageBox.Show(myRec.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
StringBuilder sb = null;
MyRecord KeyResult = null;
MyRecords myRecs = new MyRecords();
MyRecord myRec1 = new MyRecord();
myRec1.Key = "DC";
myRec1.FirstName = "小呆";
myRec1.LastName = "張";
myRec1.Gender = "男";
myRecs.Add(myRec1);
MyRecord myRec2 = new MyRecord();
myRec2.Key = "EP";
myRec2.FirstName = "小胖";
myRec2.LastName = "邱";
myRec2.Gender = "女";
myRecs.Add(myRec2);
MyRecord myRec3 = new MyRecord();
myRec3.Key = "Ma";
myRec3.FirstName = "大媽";
myRec3.LastName = "張";
myRec3.Gender = "女";
MyRecord myRec5 = new MyRecord();
myRec5.Key = "Bill";
myRec5.FirstName = "小書";
myRec5.LastName = "黃";
myRec5.Gender = "男";
#region 呈現 Collection 的全部資料
myRecs.Add(myRec3);
myRecs.Insert(1, myRec5);
try
{
myRecs.Add(myRec5);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
sb = new StringBuilder();
foreach (MyRecord item in myRecs)
{
sb.AppendLine(item.ToString());
}
MessageBox.Show(sb.ToString());
#endregion
#region 將刪除後的 Collection 的資料呈現出來
myRecs.Remove(myRec5);
sb = new StringBuilder();
foreach (MyRecord item in myRecs)
{
sb.AppendLine(item.ToString());
}
MessageBox.Show(sb.ToString());
#endregion
#region 使用 Key 的方式找出符合的資料
KeyResult = myRecs["EP"];
if (KeyResult != null)
{
MessageBox.Show(KeyResult.ToString());
}
else
MessageBox.Show("資料不存在!!!");
KeyResult = myRecs["Bill"];
if (KeyResult != null)
{
MessageBox.Show(KeyResult.ToString());
}
else
MessageBox.Show("資料不存在!!!");
#endregion
#region 使用 Index 的方式找出符合的資料
KeyResult = myRecs[2];
MessageBox.Show(KeyResult.ToString());
#endregion
}
}
}
結果:請自行執行成是觀看結果,謝謝!!!
參考:
CollectionBase 類別
(原創) 如何建立自己的Collection? (.NET) (C#) (C++/CLI) (C/C++)
Creating Strongly Typed Custom Collections in C#
Custom Collection in C# - Part 1 A Strongly Typed Custom Collection with C#