1.为了彻底理解动态数组List<>和ArrayList的特性,基于静态数组制作一个动态数组
2.首先创建一个泛型类
internal class Array1<E>
{
private E[] data;//私有的E类型的数组
private int N;//私有的N记录实例存储数据
}
3.给这个类添加构造方法,在创建自己的动态数组时,可以设置数组的默认大小,也可以不设置
public Array1(int capacity)
{
data=new E[capacity];//新建容量大小
N = 0;
}
public Array1() : this(10) { }//默认10个
4.添加Add方法,用于增加动态数组的元素
public void Add(int index, E e) {
if (index < 0 || index > N) { throw new ArgumentException("超出限制"); }//判断索引是否正确
if(N==data.Length) { ResetCapacity(data.Length * 2); }//扩容
for(int i=N-1;i>=index;i–) //从最后一个元素开始,逐次往后移动,直到将新增的元素填到索引中
{
data[i + 1] = data[i];
}
data[index] = e;
N++;//数组的元素数量加一
}
5.添加Remove方法,将需要删除的元素索引,从后一个进行覆盖
public void Remove(int index)
{
if (index < 0 || index >= N) { throw new ArgumentException("超出限制"); }
for (int i = index; i < N-1; i++)
{
data[i]= data[i+1];
}
if (N <= data.Length / 4)//如果储存的元素小于数组容量的四分之一,则进行缩容
{
ResetCapacity(data.Length / 2);
}
data[N – 1] = default(E);//最后一位空缺的元素赋默认值
N–;//数组的元素数量减一
}
6.新建刷新容量方法,新建一个新的数组,方法参数为新的数组的容量大小,将旧数组的元素依次复制到新的数组中
public void ResetCapacity(int newCapacity)//新建新的数组,将旧数组元素复制到新数组元素中
{
E[] newDate=new E[newCapacity];
for (int i = 0; i < N; i++)
{
newDate[i] = data[i];
}
data = newDate;
}
7.新建两个只读属性,用于向外输出数组的大小和数组记录元素的数量
public int Capacity { get { return data.Length; } }
public int Count { get { return N; } }
8.重写一个ToString方法,用于自定义的输出数组,可以形象的展示数组内部的大小,具体元素等
public override string ToString () {
StringBuilder sb=new StringBuilder();//使用StringBuilder类来组合字符串
sb.Append($"capacity:{Capacity},count:{N}");
sb.Append('[');
for (int i = 0; i < N; i++)
{
sb.Append(data[i]);
sb.Append(", ");
}
sb.Append("]");
return sb.ToString ();
9.新增一些其它的方法,都是基于以上几个基本的方法
public bool IsEmpty { get { return N == 0; } }
public void TopAdd(E NewE)
{
Add(0, NewE);
}
public void TopRemove()
{
Remove(0);
}
public void EndAdd(E NewE)
{
Add(N, NewE);
}
public void EndRemove()
{
Remove(N-1);
}
public bool Contains(E value)
{
for (int i = 0; i < N; i++)
{
if (data[i].Equals(value)) return true;
}
return false;
}
public int Indexof(E value)
{
for (int i = 0; i < N; i++)
{
if (data[i].Equals(value)) return i;
}
return -1;
}
public E GetValue(int index)
{
if (index < 0 || index > N) { throw new ArgumentException("超出限制"); }
return data[index];
}
在main函数中使用这个自定义的动态数组类,可以实现List<T>的部分功能
static void Main(string[] args)
{
Array1<string> a = new Array1<string>();
for(int i = 0;i<11;i++) { a.Add(i, i.ToString()); }
Console.WriteLine(a.ToString());
Console.WriteLine(a.Contains("11"));
a.Remove(5);
Console.WriteLine(a.ToString());
for (int i = 0; i < 9; i++)
{
a.Remove(0);
}
Console.WriteLine(a.ToString());
}


