给定一个列表,哪种方法更好地确定其中元素的数量?
var myList = new List<string>();
myList.Count
myList.Count()
Count()
是由LINQ引入的扩展方法,而Count
属性是列表本身的一部分(派生自ICollection
)。但在内部,LINQ会检查您的IEnumerable
是否实现了ICollection
,如果实现了,则使用Count
属性。因此,最终使用哪一个在List
上没有任何区别。
为了进一步证明我的观点,这里是Enumerable.Count()
的Reflector代码:
public static int Count<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
ICollection<TSource> is2 = source as ICollection<TSource>;
if (is2 != null)
{
return is2.Count;
}
int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
}
List
变成了没有 Count
属性的其他 IEnumerable
,我建议使用 Count()
。 - DLeh始终优先使用类型上的Count
和Length
属性,而不是扩展方法Count()
。 对于每个包含它们的类型,前者的时间复杂度为O(1)。 Count()
扩展方法具有一些类型检查优化,可以使其运行时间也为O(1),但如果基础集合不是它所知道的少数几种类型之一,则会降级为O(N)。
Any()
扩展方法。 - GregCount > 0
而不是 Any()
。 - RudeymyList.Count是列表对象上的方法,它只返回字段的值,因此非常快。由于它是一个小方法,编译器(或运行时)很可能会将其内联,然后允许编译器进行其他优化。
myList.Count()调用了一个扩展方法(由LINQ引入),它会遍历IEnumerable中的所有项,因此应该要慢得多。
但是(在Microsoft实现中),Count扩展方法对Lists进行了“特殊处理”,使其可以使用列表的Count属性,这意味着Count()方法只比Count属性慢一点点。
在大多数应用程序中,您不太可能能够区分速度差异。
所以,如果您知道正在处理的是List,请使用Count属性;否则,如果您有一个“未知”的IEnumerable,请使用Count()方法并让它为您进行优化。
Count()
扩展。这样,您就不必重构代码(例如使用 Length
)。Count()
可以让您少担心一件事情,即使您决定使用不同类型的集合,也无需修改代码(因为.Count()
可以适用于数组、列表等)。 - Don Cheadle
int
吗?还是long
?这有关系吗?对于这段代码或大多数代码来说显然不重要... - Konrad Rudolph