为什么List <double>类型以这种方式运行?

时间:2015-05-30 09:16:36

标签: c# list

这是一个小程序,用于添加,删除,插入项目(双)到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值。

enter image description here

任何人都可以向我解释一下吗?

由于

3 个答案:

答案 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保持数组的大小。