出于无聊,我决定使用 IEnumerable 从头开始编写 List 的实现。我遇到了一些我真的不知道如何解决的问题:
- 当索引为空或设置为默认值(T)时,您将如何调整通用数组(T[])的大小?
- 既然你不能为空 T,你如何克服默认值为 0 的数值原始问题?
- 如果对 #2 无能为力,如何阻止 GetEnumerator() 方法在使用数值数据类型时返回 0?
最后但并非最不重要的一点是,缩小阵列大小的标准做法是什么?我肯定知道,扩大规模的最佳解决方案之一是将当前长度增加 2 的幂;您是否以及何时缩小规模?每个 Remove/RemoveAt 还是按当前使用的长度 % 2?
这是我到目前为止所做的:
public class List<T> : IEnumerable<T>
{
T[] list = new T[32];
int current;
public void Add(T item)
{
if (current + 1 > list.Length)
{
T[] temp = new T[list.Length * 2];
Array.Copy(list, temp, list.Length);
list = temp;
}
list[current] = item;
current++;
}
public void Remove(T item)
{
for (int i = 0; i < list.Length; i++)
if (list[i].Equals(item))
list[i] = default(T);
}
public void RemoveAt(int index)
{
list[index] = default(T);
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
}
提前致谢。