我经常写这样的代码:
if ( list.Count > 0 ) { }
这样做效率高吗?操作是否像这样:
- 遍历列表并计算其元素数量
- 结果:986,000 个元素
- 986,000 是否大于 0?
- 返回 true
还是像这样:
- 检索列表中存储的元素数量(986,000)
- 986,000 是否大于 0?
- 返回 true
也就是说,获取列表元素的数量,是否需要完全遍历列表,或者元素数量记录在某处?所有 ICollection
类都是这种情况吗?
那么列表的 Capacity
呢?
我经常写这样的代码:
if ( list.Count > 0 ) { }
这样做效率高吗?操作是否像这样:
还是像这样:
也就是说,获取列表元素的数量,是否需要完全遍历列表,或者元素数量记录在某处?所有 ICollection
类都是这种情况吗?
那么列表的 Capacity
呢?
if ( list.Count > 0 ) { }
这样有效吗?if ( sequence.Count() > 0 ) { }
怎么样?(注意 Count()
上的括号。)Count
属性的列表。 如果是,则调用它。 如果不是,则逐个计算整个序列,然后将其与零进行比较。if (sequence.Any())
为什么这样更高效?Any
是 true;如果失败,则 Any
是 false。要知道罐子里的糖豆数量是否大于零,您不需要计算糖果豆的数量。只需要查看是否至少有一个。Capacity
属性呢?List<T>
的Count
属性以及所有其他ICollection<T>
实现都是O(1)操作,这意味着它快速且与列表中元素数量无关。此外,还存在一个扩展方法Count()
,可在任何IEnumerable<T>
上调用。该方法是O(n),这意味着其运行时取决于可枚举对象中元素的数量。但是,有一个例外:如果可枚举对象确实是ICollection<T>
或ICollection
的实现,则使用Count
属性,使其再次成为O(1)操作。
Capacity
属性不是您需要担心的问题。在列表中,计数是O(1)
操作,这是最快的方式。
计数:实际上列表中存在的元素数量。
容量:更好的文档说明:
获取或设置内部数据结构可以容纳的元素总数而不需要调整大小。
请使用以下代码:list.Any()
。它可能比List<>.Count
慢,但对于大多数IEnumerable<>,它都是最有效的。
Capacity
可以大于Count
。当您计划稍后添加大量项目时,可以使用它。
List.Count的实现如下(实际上是O(1)):
public int Count
{
get
{
return this._size; // this is a field
}
}
.Any()
жҜ”дҪҝз”Ё.Count() > 0
жӣҙеҘҪпјҢдҪҶе®ғзҡ„ж•ҲзҺҮз•ҘдҪҺпјҢеӣ дёәе®ғдјҡеңЁйӣҶеҗҲдёҠеҲӣе»әдёҖдёӘжһҡдёҫеҷЁгҖӮ - Gabe容量并不告诉您列表中有多少个对象 - 只是列表准备好了多少。
来自 MSDN:
Capacity is the number of elements that the List<T> can store before resizing is required, while Count is the number of elements that are actually in the List<T>.
List.Count是超级快的,它是一个被访问的属性,而List.Count()来自IEnumerable,我相信它必须通过列表进行完整枚举。
ICollection<T>
的检查失败,那么代码会检查非泛型的ICollection
。因此,大多数框架集合都不会受到协变问题的影响。 - phoog