这是一个小程序,用于添加,删除,插入项目(双)到Ilist集合。
class ProgramL
{
static void Main(string[] args)
{
IList<double> myList = new List<double>();
myList.Add(1.54);
myList.Add(56.54);
myList.Insert(1,58.54);
myList.Add(11.44);
myList.Add(121.44);
myList.Add(111.44);
myList.Add(1221.44);
myList.Add(1331.44);
myList.Add(161.44);
myList.Add(21.58);
myList.Remove(21.58);
Console.ReadLine();
}
}
所以在添加,插入和删除操作之后还剩下9个项目。 但根据图片,为什么该列表包含16个项目。最后7项初始化为0.0值。
任何人都可以向我解释一下吗?
由于
答案 0 :(得分:5)
有两个数字:
Count
- 添加到列表中的实际元素数Capacity
- 用于存储元素下的元素的数组大小这是为了提高性能并减少List<T>
用于存储元素的底层数组的分配数量。
当您实例化列表并添加第一个元素时,它会以初始容量(4个元素)创建。添加元素并且现有容量不足时,将重新分配基础数组以包含两倍的元素。那是因为重新分配数组非常昂贵,并且您不希望每次将元素添加到列表时都会发生这种情况。
您可以使用TrimExcess
方法使基础数组大小更接近集合中的项目数。
如果没有新元素添加到集合中,此方法可用于最小化集合的内存开销。但是,重新分配和复制大
List<T>
的成本可能相当大,因此如果列表容量超过90%,则TrimExcess
方法不会执行任何操作。这样可以避免因相对较小的收益而产生大量的重新分配成本。
答案 1 :(得分:3)
这可能是因为List被实现为类似Java的Arraylist,其中后备数组用于存储元素。如果后备阵列已填满,则列表会生成一个新的更大的后备阵列并复制元素。这需要一些时间,这就是为什么(提高性能)支持数组的大小在某些步骤中增加的原因,因此可能大于列表中元素的实际计数。
答案 2 :(得分:2)
在内部,List<>
将值存储在数组中。该数组以4个元素开始,当满时,扩展为8,然后是16等。因为您已经为列表分配了9个元素,所以该数组长度为16个元素。
该列表通过Count
跟踪所使用数组的元素数量。 Capacity
保持数组的大小。