给定一个列表,获取列表的集合数量常有两种方式:Count和Count(),Count是list的一个属性,Count()是Linq引入的扩展方法。那么这两个方式有什么区别呢?哪种方式在性能上有优势呢?
我们先看Count属性:
List类在内部定义了_size属性,在对List的增删操作中,都维护了这个_size属性,而Count属性就是_size的值,所以Count属性获取List的数量的时间复杂度是O(1)。
再看Linq下的Count()扩展方法:
该方法会先检查传入集合的类型,如果集合继承自ICollection,则可以直接获取其Count属性,其时间复杂度也为O(1),如果集合不能转换为ICollection<T>或ICollection时,需要遍历集合,获取集合数量,时间复杂度就变成了O(n)。
综上,如果集合继承自ICollection接口,则使用Count属性和Count()方法是没有区别的,否则,直接通过属性Count获取集合数量的效率会更高。