我经常编写这样的代码:
if ( list.Count > 0 ) { }
这有效率吗?这个操作看起来像:
elements
或者像这样:
也就是说,要获得列表中元素的数量,您必须一直在列表中进行计数,还是在某个地方记录了元素的数量?所有ICollection
类都是这样吗?
名单上的Capacity
呢?
发布于 2012-04-13 06:44:30
我经常写这样的代码:
if ( list.Count > 0 ) { }
这样有效吗?
是。它检索列表中的计数,该列表存储在列表中的一个字段中,并将其与零进行比较。
现在有一个你没有问的问题:
,
if ( sequence.Count() > 0 ) { }
呢?(请注意Count()
上的括号。)
我们在运行时询问序列,以确定它是否具有可以有效计算的Count
属性的列表。如果有,我们就叫它。如果没有,我们一次计算整个序列,然后将其与零进行比较。
,难道不是非常低效吗?
是。
,什么会更有效率?
if (sequence.Any())
,为什么这样更有效率?
因为它试图迭代一个元素。如果成功,则Any
为真;如果失败,则Any
为false。您不需要计算jar中的jellybeans数量,就可以知道是否有超过零的jellybeans。你只需要看看是否至少有一个。
除了效率要高得多外,代码现在读起来就像代码的预期意义一样。如果你想问“清单上有什么东西吗?”然后问:“清单上有什么东西吗?”而不是“列表中的项目数是否大于零?”
列表的
Capacity
属性如何?
这将告诉您列表的内部数据结构中预先分配了多少空间。它是列表在分配更多内存之前可以存储的项的数量。
发布于 2012-04-13 06:40:12
List<T>
中的List<T>
属性和BCL中的所有其他ICollection<T>
实现都是O(1)操作,这意味着它是快速的,并且与列表中的元素数无关。
还有一个扩展方法Count()
可以在任何IEnumerable<T>
上调用。该方法是O(n),这意味着它的运行时取决于可枚举元素的数量。但是,有一个例外:如果可枚举实际上是ICollection<T>
或ICollection
的实现,则它使用Count
属性使其再次成为O(1)操作。
Capacity
属性通常没有什么需要您担心的。
发布于 2012-04-13 06:37:44
使用以下代码:list.Any()
。它可能比List<>.Count
慢,但对任何IEnumerable<>都是最有效的。
Capacity
可以比Count
更好。当您计划稍后添加许多项时,就会使用它。
List.Count的实现如下(实际上是O(1) ):
public int Count
{
get
{
return this._size; // this is a field
}
}
https://stackoverflow.com/questions/10142852
复制相似问题