list.count是否在物理上迭代列表以对其进行计数,或者它是否保留指针

Lou*_*der 10 .net c# vb.net performance memory-management

我正在逐步查看一个大的对象列表,以便对列表中的所述对象执行一些操作.

在迭代期间,我将根据特定条件从列表中删除一些对象.

完成所有操作后,我需要更新有关列表中对象数量的UI.(T列表).

题:

当我调用list.count时,.net是否实际遍历列表来计算它,还是将计数存储为属性/变量?

如果.net在列表中进行物理重新迭代,我也可以通过列表在我自己的迭代中保留一个计数器,并节省开销?

谢谢

Den*_*s_E 19

它只是保留一个内部int来跟踪项目数.所以没有迭代.文档说检索Count是一个O(1)操作:

http://msdn.microsoft.com/en-us/library/27b47ht3%28v=vs.110%29.aspx

你可以自己看看:

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs


Str*_*ior 7

List实现为数组列表,它跟踪自己的大小,因此调用该.Count属性不需要任何迭代.

如果调用LINQ .Count()扩展方法,这将检查是否存在底层IEnumerable<>实现ICollection(a List<>确实如此),并.Count在可能的情况下使用该接口上的属性.所以这不会导致任何迭代发生.

顺便提一下,如果您在迭代它时尝试从列表中删除项目,则还会遇到其他问题.当你从迭代器下面删除元素时,迭代应该如何表现并不是很清楚,所以List<>如果自创建枚举数以来修改了列表,s将完全避免这个问题.