当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-Doeslist.countphysicallyiteratethelisttocountit,ordoesitkeeppointersshare

时间:2023-04-10 13:37:54 C#

list.countDoesitphysicallyiteratethelisttocountit,ordoesitkeeppointers遍历一个大的对象列表对列表中的所述对象执行某些操作。在迭代过程中,我会根据特定条件从列表中删除一些对象。完成所有操作后,我需要更新有关列表中对象数量的UI。(T列表)。问题:当我调用list.count时,.net是否实际遍历列表以对其进行计数,还是将计数存储为属性/变量?如果.net在列表中进行物理重新迭代,我是否也可以通过列表在自己的迭代中保留一个计数器并节省开销?谢谢它只是保留一个内部整数来跟踪项目的数量。所以没有迭代。文档说检索计数是一个O(1)操作:http://msdn.microsoft.com/en-us/library/27b47ht3%28v=vs.110%29.aspx你可以自己看看:http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.csList被实现为一个数组列表,它跟踪自己的大小,因此调用.Count属性不需要任何迭代。如果您调用LINQ.Count()扩展方法,这将检查底层IEnumerable是否实现了ICollection(List实现),并在可能的情况下使用该接口上的.Count属性。所以这不会导致任何迭代发生。顺便说一下,如果您在遍历列表的同时尝试从列表中删除项目,则会遇到其他问题。当您从迭代器中删除元素时,迭代应该如何表现并不是很清楚,因此List将完全避免这个问题,如果自枚举器创建以来列表已被修改,则会抛出异常。您可以使用反编译器(例如免费提供的ILSpy)来回答这些问题。如果你指的是List类型,那么Countgetter只需要读取一个字段:publicintCount{get{returnthis._size;}}如在备注选项卡http://msdn.microsoft.com/en-us/library/27b47ht3(v=vs.110).aspx中所述,检索此属性的值是一个O(1)操作。这意味着没有迭代发生。你用vb.net和c#标记了你的问题,所以在回答“如果.net物理上重新遍历列表,我是否也可以在我自己的列表迭代中保留一个计数器,并节省开销?”如果你为了迭代使用Fori=firstTolast那么VB.NET将在进入循环时评估first和last:DimfirstAsInteger=1DimlastAsInteger=3Fori=firstTolastConsole.Write(i.ToString()&"")last=-99NextOutput:123如果在C#中执行等效操作,则在每次迭代时计算第一个和最后一个:intfirst=1;最后一个=1;for(inti=first;ioutput:1如果您的.Count()函数/属性的评估成本很高,和/或您不希望在每次迭代时都重新评估它(出于某些其他原因),则在C#中可以赋值给一个临时变量。以上是C#学习教程:list.count是物理迭代list来计数,还是保留指针share的全部内容,如果对大家有用以及需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除转载请注明出处: