计数和容量有多快?

Oli*_*ver 11 c#

我经常写这样的代码:

if ( list.Count > 0 ) { }
Run Code Online (Sandbox Code Playgroud)

这有效吗?此操作是否如下所示:

  • 遍历列表并计算其元素
  • 结果:986,000个元素
  • 986,000大于0吗?
  • 返回true

或者像这样:

  • 检索列表中存储的元素数(986,000)
  • 986,000大于0吗?
  • 返回true

也就是说,要获得列表中的元素数量,您是否必须在列表中一直计算,或者是在某处记录的元素数量?这是所有ICollection课程的情况吗?

怎么样的Capacity名单呢?

Eri*_*ert 33

我经常写这样的代码: if ( list.Count > 0 ) { }这有效吗?

是.它检索列表中的计数,该计数存储在列表内的字段中,并将其与零进行比较.

现在你问的一个问题是:

怎么样 if ( sequence.Count() > 0 ) { }?(注意括号Count().)

我们在运行时查询序列以查看它是否是具有Count可以有效计算的属性的列表.如果是,我们称之为.如果没有,我们一次计算整个序列一个项目,然后将其与零进行比较.

这不是非常低效吗?

是.

什么会更有效率?

if (sequence.Any())

为什么效率更高?

因为它试图迭代一个元素.如果成功,那Any就是真的; 如果失败那么Any就是假的.你不需要计算罐子里的软糖数量,以便知道是否有超过零.您只需要查看是否至少有一个.

除了效率更高之外,代码现在看起来像代码的预期含义.如果您打算询问"列表中是否有任何项目?" 然后问"列表中有没有项目?" 而不是"列表中的项目数是否大于零?"

Capacity列表的属性怎么样?

这告诉您在列表的内部数据结构中预先分配了多少空间.它是必须分配更多内存之前列表可以存储的项目数量.

  • @CodeInChaos如果检查`ICollection <T>`失败,则代码检查非泛型`ICollection`.因此,大多数框架集合都不受协方差问题的影响. (2认同)

Dan*_*rth 6

中的Count属性List<T>- 以及ICollection<T>BCL中的所有其他实现 - 是O(1)操作,这意味着它快速且独立于列表中元素的数量.

还存在Count()可以在任何上调用的扩展方法IEnumerable<T>.此方法为O(n),这意味着它的运行时间取决于可枚举中的元素数.但是,有一个例外:如果可枚举实际上是一个实现,ICollection<T>或者ICollection它使用该Count属性再次使其成为O(1)操作.


Capacity物业通常无需担心.

  • 那么,考虑到op在谈到列表中的986,000个元素,在适当的地方巧妙地管理容量*可以*带来显着的好处. (2认同)