我想了解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;
}
}
}
在内部,List<T>
对象保持一个默认大小的数组(根据参考源代码,为0)。当数组已满时,将创建一个新数组,其大小是前一个数组的两倍,并且将第一个数组中的所有项移到新数组中。
添加一个元素到这个列表(数组大小= 2):
- 第1项
导致列表后面的数组变成(array size = 4):
- 第1项
- 项3 零
如果事先知道列表的可能大小,则可以选择将期望的数字传递给List<T>
的构造函数。数组大小将设置为该长度,这可能会为您提供更好的总体性能,因为它不需要重新创建数组。