从我删除元素后,通用列表如何显示?

时间:2016-12-23 19:11:00

标签: c# list element

假设我有一个通用列表:

List<int> myList= new List<int> {0,1,2,3};

执行myList.RemoveAt(0)后,我的列表会缩小吗?

2 个答案:

答案 0 :(得分:4)

当然会缩小。你可以自己解决这个问题:

int count = myList.Count;

但是为了进一步阐述,List<T>类型有一个支持它的数组。当您创建这样的列表时:

var list = new List<int>(10);

它将创建一个长度为10的数组。如果从列表中删除项目,则计数将减少1.但是,数组仍将保持相同的长度。现在,如果向列表中添加10个以上的整数,那么该数组将不足以容纳11个整数,因此将创建一个更大的数组,并将原始数组的内容复制到更大的数组。

答案 1 :(得分:0)

@CodingYoshi在这里绝对正确。我只想添加一个代码示例来说明这一点:

List<int> listLength = new List<int>(10)
        {
            1, 2, 3, 4, 5
        };

        // 5
        Console.WriteLine(listLength.Count);

        // 10
        Console.WriteLine(listLength.Capacity);

        listLength.AddRange(new[] { 6, 7, 8, 9, 10 });

        // 10
        Console.WriteLine(listLength.Count);

        // 10
        Console.WriteLine(listLength.Capacity);

        listLength.AddRange(new[] { 11, 12, 13, 14, 15 });

        // 15
        Console.WriteLine(listLength.Count);

        // 20
        Console.WriteLine(listLength.Capacity);

        for (int i = 0; i < 10; i++)
        {
            listLength.RemoveAt(0);
        }

        // 5
        Console.WriteLine(listLength.Count);

        // Still 20 - as you can see, we decreased Count to the original number of items
        // but Capacity didn't shrink to its original amount
        Console.WriteLine(listLength.Capacity);

通常,从列表中删除项目不会导致后备阵列实际变小。 explicitly decrease capacity可以通过调用TrimExcess method释放额外空间,这将导致容量减少到当前计数。 (显然,如果当前计数实际上小于当前容量,这只会缩小后备阵列。)

话虽如此,从列表中移除对象可能会导致整个应用程序的内存占用量减少(如果从列表中删除对象导致对象符合垃圾回收条件)。集合类(以及事件处理程序)是内存泄漏的重要来源。 (Some people会争论这是否是“真实”内存泄漏的一个例子,但效果完全相同)。