C#自定义集合
C#自定义集合
对于基于Unity游戏引擎来深入开发商业级高品质游戏的广大游戏开发人员来说,使用C#语言来开发诸如“对象缓冲池”等技术应用来说,开发我们的“自定义集合”是非常必要的。
根据笔者经验,一个好的C#"自定义集合"需要满足以下需求:
1: 可以使用foreach 方便的遍历集合元素。
2: 采用索引器技术,提供直接的方式访问或者赋值内部元素。
3: 提供类似 IList 接口的常用访问方法:
Add() 、Clear()、Insert()、Remove()
本技术需要读者提前具备集合、索引器等相关知识(读者可以看笔者以前博客介绍文章),为了好说明,先给出4个演示类,组成一个C#自定义集合的演示示例。
第一个: 实体类
public class Person
{
//public static int i;
private string _Name;
private int _Age;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public int Age
{
get { return _Age; }
set { _Age = value; }
}
//public Person()
//{
// i++;
// name = "张三" + i.ToString();
//}
public Person(string strName,int intAge)
{
_Name = strName;
_Age = intAge;
}
}
第二个: 集合核心类
public class PersonCollection:IEnumerable //表示可遍历可枚举的集合接口
{
//保存Object 类型的 数组。
ArrayList al = new ArrayList();
/// <summary>
/// 实现了IEnumberable 后,返回一个迭代器对象,但具体的接口子类由程序员
/// 自己定义。
/// </summary>
/// <returns></returns>
public IEnumerator GetEnumerator()
{
return new MyGetEnumberater(this.al);
}
/// <summary>
/// 索引器
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Person this[int index]
{
get { return (Person)al[index]; }
}
public void Add(Person p)
{
al.Add(p);
}
public void AddRange(ICollection ip)
{
al.AddRange(ip);
}
public void Clear()
{
al.Clear();
}
public void Insert(int index,Person value)
{
al.Insert(index,value);
}
public int IndexOf(Person p)
{
return al.IndexOf(p);
}
public void RemoveAt(int index)
{
al.RemoveAt(index);
}
public void Remove(Person p)
{
if(al.Contains(p))
{
int temp = IndexOf(p);
RemoveAt(temp);
}
}
}//Class_end
第3个: 自定义的“迭代器”类
public class MyGetEnumberater:IEnumerator
{
int i = 0;
ArrayList ps;
public MyGetEnumberater(ArrayList p)
{
ps = p;
}
/// <summary>
/// 得到当前元素
/// </summary>
public object Current
{
get { return ps[i++]; } //注意这里的i++ ,是先运算再自增。
//相当于
//object o=ps[i];
//i++;
//return o;
}
/// <summary>
/// 移动到下一个元素
/// </summary>
/// <returns></returns>
public bool MoveNext()
{
if (i > ps.Count - 1)
{
return false;
}
return true;
}
//重置
public void Reset()
{
i = 0;
}
}
第4个:测试“自定义集合”的测试类
class Program
{
static void Main(string[] args)
{
PersonCollection pc = new PersonCollection();
pc.Add(new Person("张三",10));
pc.Add(new Person("李四",20));
pc.Add(new Person("王五",25));
//本质foreach 就是调用接口中的一个方法
foreach (Person item in pc)
{
Console.WriteLine(item.Name+" "+item.Age);
}
//使用自定义的“索引器”访问。
Console.WriteLine("-----使用索引器访问------");
Console.WriteLine(pc[0].Name);
Console.WriteLine(pc[0].Age);
Console.WriteLine(pc[1].Name);
Console.WriteLine(pc[1].Age);
Console.WriteLine(pc[2].Name);
Console.WriteLine(pc[2].Age);
Console.ReadLine();
}
}
读者可以通过拷贝以上代码,建立测试用例。通过Program 类测试我们发现,我们自己定义的PersonCollection.cs 类,是可以与ArrayList集合类似,使用foreach 做迭代输出,使用“索引器”来对集合中数据作直接访问。
我们自定义的“迭代器”类(MyGetEnumberater),其实就是foreach 的内部原理:
foreach(Person p in PC){}
等价于如下:
IEnumberable eab=PC as IEnumerable; //可迭代接口
IEnumberator etor=eab.GetEnumerator(); //迭代接口
while(etor.MoveNext())
{
Person p=etor.Current;
//........
}
好了,本节关于C#“自定义集合“知识点,就介绍到这里,大家如果有问题,可以随时留言讨论。谢谢!