我试图用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#中的行为方式吗?
答案 0 :(得分:7)
在内部,List<T>
类将其项目存储在数组中。由于数组是固定大小,因此添加新项目非常昂贵,因为它需要分配新数组并将所有先前项目复制到新数组中。为了解决这个问题,List<T>
类以指数方式增长它的数组,只有当项目数量超过内部数组的容量时才会增加一倍。
换句话说,Capacity
没有引用列表中的项目数。它指的是列表可以存储的项目数,而无需重新分配它的内部数组。另请注意,您事先知道需要在阵列中存储多少项,您可以在列表的constructor中指定初始容量,以避免大量昂贵的重新分配(默认值为4)。
使用Count
属性随时获取列表中的项目数。
答案 1 :(得分:6)
容量始终大于或等于Count。如果计数超过 添加元素时的容量,容量增加了 在复制旧数据之前自动重新分配内部数组 元素和添加新元素。
您要找的是Count
,它会返回列表中当前的元素数量。
textBox1.Text = rand_num.Count.ToString();
当元素数量需要超过容量时,.NET将调整内部数组的大小,以便它可以容纳更多值,这通常是一项昂贵的操作。如果您事先知道所需的最大值,也可以设置Capacity属性。
答案 2 :(得分:0)
您应该使用:
textBox1.Text = rand_num.Count.ToString();