我想了解Collections.List <t> </t>的内部工作原理

时间:2014-06-05 11:52:54

标签: c#

我创建了自己的列表,其中静态int为length。当您不知道集合的大小并且想要构建它时,这些事情是如何完成的。我知道有一个内置列表,但我想建立自己的内容来理解它的内部工作。我在构造函数中将其定义为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;
    }
}
}

1 个答案:

答案 0 :(得分:1)

在内部,List<T>对象保持一个默认大小的数组(0,根据reference source)。当数组已满时,将创建一个新数组,与前一个数组相同,并将第一个数组中的所有项目移动到新数组。

所以在此列表中添加一个项目(数组大小= 2):

  • 第1项
  • 第2项

使列表后面的数组变为(数组大小= 4):

  • 第1项
  • 第2项
  • 第3项

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