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

时间:2012-01-04 16:05:54

标签: c# list

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

List<int> list = new List(5);

为什么这样:

list.insert(2, 3);

因以下错误而失败:

Index must be within the bounds of the List.

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

8 个答案:

答案 0 :(得分:8)

所有初始尺寸都是provide a hint to the implementation to have at least a given capacity。它不会创建一个填充N默认条目的列表;强调我的:

  

初始化List<T>的新实例且具有指定的初始容量。

如果您继续通过MSDN条目到备注部分,您将找到为什么提供此构造函数重载(再次强调我的):

  

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

     

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

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

您收到例外是因为仅逻辑的列表包含您添加的项目,更改容量不会更改逻辑存储的项目数。如果您要将List<T>.Capacity设置为小于List<T>.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<T> CreateDefaultList<T>(int entries)
{
    return new List<T>(new T[entries]);
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

将项目插入List时,它会将它们存储在数组中。当数组已满时,它会创建一个大小加倍的新数组,并复制所有项目。如果您知道要放入5000个项目,则需要指定该提示,以便最终不会进行大量的数组调整大小/复制。

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

答案 6 :(得分:0)

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

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

请参阅remarks section in the documentation

答案 7 :(得分:0)

使用

listItem.Addrange(number);