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

时间:2014-09-06 22:01:12

标签: 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();

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

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:6)

Capacity

  

容量始终大于或等于Count。如果计数超过   添加元素时的容量,容量增加了   在复制旧数据之前自动重新分配内部数组   元素和添加新元素。

您要找的是Count,它会返回列表中当前的元素数量。

textBox1.Text = rand_num.Count.ToString();

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

答案 2 :(得分:0)

您应该使用:

textBox1.Text = rand_num.Count.ToString();