使用集合,我有两种获取对象计数的方法:Count
(属性)和Count()
(方法)。有谁知道关键的区别是什么?
我可能是错的,但是我总是Count
在任何条件语句中使用该属性,因为我假设该Count()
方法对集合执行某种查询,在Count
“获取”之前必须已对该集合进行了分配。但这是一个猜测-如果我错了,我不知道性能是否会受到影响。
编辑:出于好奇,Count()
如果集合为null ,会抛出异常吗?因为我很确定该Count
属性仅返回0。
Answers:
对Count()
扩展方法的源进行反编译显示,它可以测试对象是否为ICollection
(通用或其他)对象,如果是,则仅返回基础Count
属性:
因此,如果您的代码访问Count
而不是调用Count()
,则可以绕过类型检查-理论上的性能好处,但我怀疑这会是一个明显的好处!
// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
checked
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null)
{
return collection.Count;
}
ICollection collection2 = source as ICollection;
if (collection2 != null)
{
return collection2.Count;
}
int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
}
}
Count()
中不会检查非通用ICollection
接口。它仅在.NET 4中添加。3.5和4都检查通用ICollection<T>
接口。
性能只是选择其中一项的原因之一。选择.Count()
意味着您的代码将更加通用。在某些情况下,我重构了一些不再产生集合的代码,而是重构了诸如IEnumerable之类的更通用的代码,但由于依赖于该代码.Count
而不得不将其他代码更改为,结果导致其他代码崩溃了.Count()
。如果我提出要.Count()
在任何地方都使用它,那么该代码将可能更具可重用性和可维护性。通常最好选择使用更通用的接口,如果可以的话,这是最好的选择。泛型是指由更多类型实现的更简单的接口,从而使您在代码之间具有更大的兼容性。
我并不是说.Count()
更好,而是要考虑其他一些因素,这些因素更多地涉及正在编写的代码的可重用性。
该.Count()
方法可能足够聪明,或者知道所涉及的类型,如果可以,则可以使用基础.Count
属性。
再说一次,可能不会。
我可以肯定地说,如果集合.Count
本身具有属性,那么就性能而言,这将是您最好的选择。
如果该.Count()
方法不知道集合,它将对其进行枚举,这将是一个O(n)操作。
Count
属性可能会更好,但是Count()
使用ICollection<T>.Count
此方法的方法在此处有所记录:msdn.microsoft.com/en-us/library/bb338038
Count()
method是一个扩展方法,它迭代an的每个元素IEnumerable<>
并返回其中有多少个元素。如果实例IEnumerable
实际上是List<>
,则已对其进行优化以返回该Count
属性,而不是迭代所有元素。
Count()
是否有LINQ的扩展方法-Count
是上的属性List
s,实际是.NET集合对象。
这样,Count()
由于将枚举collection / queryable对象,因此几乎总是比较慢。在列表,队列,堆栈等上,使用Count
。或对于数组- Length
。
.
运算符应用于null值。