为什么在构造上提供足够的尺寸时列表插入失败?

如果我们有以下变量声明:

List list = new List(5); 

为什么这样:

 list.insert(2, 3); 

失败,出现以下错误:

 Index must be within the bounds of the List. 

提供初始尺寸有什么意义?

所有初始大小确实为实现提供了至少具有给定容量的提示 。 它不会创建一个填充N默认条目的列表; 强调我的:

初始化List类的新实例,该实例为空且具有指定的初始容量。

如果你继续通过MSDN条目到备注部分,你会发现为什么提供这个构造函数重载(再次强调我的):

List的容量是List可以容纳的元素数。 当元素添加到List ,通过重新分配内部数组,容量会根据需要自动增加。

如果可以估计集合的大小,则指定初始容量消除了在向List添加元素的同时执行大量resize操作的需要

简而言之, List.CountList.Capacity (“如果Count在添加元素时超过Capacity,则容量会增加……”)。

您收到exception,因为列表仅逻辑上包含您添加的项目,更改容量不会更改逻辑存储的项目数。 如果您将List.Capacity为小于List.Count我们可以测试此行为的另一个方向:

 Unhandled Exception: System.ArgumentOutOfRangeException: capacity was less than the current size. Parameter name: value at System.Collections.Generic.List`1.set_Capacity(Int32 value) 

或许创建您正在寻找的行为:

 public static List CreateDefaultList(int entries) { return new List(new T[entries]); } 

在内部, List(T)是在后台使用数组实现的。 以这种方式初始化列表时,您只需设置随列表增长而resize的基础数组的大小。 因此,您正在初始化初始容量。 这并不意味着您的列表中包含许多元素。

首先将元素初始化,然后使用.Add(item)向元素添加元素,从而将元素添加到列表中。

构造函数中的大小告诉它为背景数组分配多少 – 但它仍然是空的(只有:具有一定量的初始空间的空)。

您可以将其插入列表的已用部分或最后。

因为insert假定列表实际上已经插入了许多项目 – 容量与大小不同。 使用给定容量初始化列表只会设置内部数组的大小 – 当您知道要插入的项目数时,它是一种优化以防止数组resize。

List(int)构造函数指定列表的初始容量。 它没有指定初始元素的数量。 在构造时,列表为空,因此任何插入只能在索引0处完成。

初始大小最初用于指示内部数组的大小。

将项目插入List时,它会将它们存储在数组中。 当数组已满时,它会创建一个大小为double的新数组,并复制所有项。 如果你有一个想法,你将要放入5000项,你会想要指定该提示,所以它不会最终做很多数组resize/复制。

初始大小并不表示列表中有任何项目。

这是因为您在构造函数中指定的整数是List可以容纳的数量。 添加项目时,列表会自动增加。 指定与要添加的项目数相匹配的初始容量时,可以避免resize。

但是,您仍然必须使用Add方法添加新项目。

请参阅文档中的备注部分

使用

 listItem.Addrange(number);