我想了解Collections.List的内部工作

本文关键字:内部 工作 了解 Collections List | 更新日期: 2023-09-27 18:06:56

我创建了自己的列表,长度为静态int。当你不知道一个集合的大小而又想要构造它的时候,该怎么做呢?我知道有一个内置列表,但我想建立我自己的,以了解它的内部工作。我在构造函数中将它定义为size = int 5所以它现在将输出1 2 3 0 0我想知道如何调整它的大小并使用未定义长度的构造函数。我自己也想不明白,希望你能帮忙。

我修复了它。谢谢你们的回答,我从来没有听说过。net参考,所以感谢这个网站。

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        List l = new List();
        l.Add(1);
        l.Add(2);
        l.Add(3);
        l.Add(4);
        foreach (int n in l)
        {
            Console.WriteLine(n);
        }
        Console.Read();
    }
}
class List
{
    private int _lLength;
    private int[] _lArray;
    private int _lPos;
    public List()
    {
        /*
         * Create an array with a default size
         * If it doesn't fit anymore create a new one and copy it
         * to a new array and double the size
         */
        this._lArray = new int[2];
    }
    public List(int c)
    {
        this._lLength = c;
        this._lArray = new int[this._lLength];
        this._lPos = 0;
    }
    public void Add(int n)
    {
        if (this._lArray.Length <= this._lPos)
        {
            // So now is the array < then the array we want to return
            int[] tmp = this._lArray;
            this._lArray = new int[tmp.Length * 2];
            Array.Copy(tmp, this._lArray, tmp.Length);
        }
        this._lArray[this._lPos++] = n;
    }
    public IEnumerator<int> GetEnumerator()
    {
        foreach (int n in this._lArray)
            yield return n;
    }
}
}

我想了解Collections.List<T>的内部工作

在内部,List<T>对象保持一个默认大小的数组(根据参考源代码,为0)。当数组已满时,将创建一个新数组,其大小是前一个数组的两倍,并且将第一个数组中的所有项移到新数组中。

添加一个元素到这个列表(数组大小= 2):

  • 第1项

导致列表后面的数组变成(array size = 4):

  • 第1项
  • 项3

如果事先知道列表的可能大小,则可以选择将期望的数字传递给List<T>的构造函数。数组大小将设置为该长度,这可能会为您提供更好的总体性能,因为它不需要重新创建数组。