为什么List Capacity调整大小远远超过需要?

kil*_*ist 0 c# list

我正在尝试使用0到20000范围内的10000个随机整数填充列表.以下是我如何执行此操作的代码:

List<int> rand_num = new List<int>();
        Random rand = new Random();
        int i =0;
        //int counter = 0;
        while (i < 10000)
        {
            rand_num.Add(rand.Next(0, 20000));
            i++;
        }

        textBox1.Text = rand_num.Capacity.ToString();
Run Code Online (Sandbox Code Playgroud)

问题是当它到达textBox1.Text = rand_num.Capacity.ToString();线路时,输出是16384.我只输入了10000个数字,它怎么能比我需要的更大到6384?我错过了关于列表在c#中的行为方式吗?

p.s*_*w.g 7

在内部,List<T>类将其项存储在数组中.由于数组是固定大小,因此添加新项目非常昂贵,因为它需要分配新数组并将所有先前项目复制到新数组中.为了解决这个问题,List<T>该类会以指数方式增加它的数组,只有当项目数量超过其内部数组的容量时才会增加一倍.

换句话说,Capacity不是指列表中的项目数.它指的是列表可以存储的项目数,而无需重新分配它的内部数组.另请注意,您事先知道需要在阵列中存储多少项,您可以在列表的构造函数中指定初始容量,以避免大量昂贵的重新分配(默认值为4).

使用该Count属性可随时获取列表中的项目数.


Cyr*_*ral 6

Capacity在需要在内部调整大小之前,列表可以容纳多少.

容量始终大于或等于Count.如果Count在添加元素时超出容量,则在复制旧元素和添加新元素之前,通过自动重新分配内部数组来增加容量.

您正在寻找的是Count,它返回列表中当前元素的数量.

textBox1.Text = rand_num.Count.ToString();
Run Code Online (Sandbox Code Playgroud)

当元素数量需要超过容量时,.NET将调整内部数组的大小,以便它可以容纳更多值,这通常是一项昂贵的操作.如果您事先知道所需的最大值,也可以设置Capacity属性.

  • @DanielMann LINQ`Count()`方法有优化,如果大小已知,则不迭代集合(如果类型实现`ICollection`我相信). (2认同)
  • @Finalreq如果你想计算相同的容量,你知道最终列表中有多少项,只需使用[this constructor](http://msdn.microsoft.com/en-us/library/dw8e0z9z%28v=vs相反,.110%29.aspx).`List <int> rand_num = new List <int>(10000);`.这将把"容量"设置为10000以开始,并且列表将仅在您添加第10001项后开始调整大小. (2认同)