Count()(linq扩展)和List<;T>;.计数
本文关键字:计数 lt gt List linq 扩展 Count | 更新日期: 2023-09-27 17:59:59
List<string> list = new List<string>() {"a", "b", "c"};
IEnumerable<string> enumerable = list;
int c1 = list.Count;
int c2 = list.Count();
int c3 = enumerable.Count();
最后三个语句在性能和实现方面是否存在差异?list.Count()
的性能会比list.Count
差还是相同?如果引用的类型是IEnumerable<string>
,这有关系吗?
让我们看看反射器:
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;
}
ICollection is3 = source as ICollection;
if (is3 != null)
{
return is3.Count;
}
int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
{
num++;
}
}
return num;
}
因此,如果您的IEnumerable<T>
实现ICollection<T>
或ICollection
,它将返回Count
属性。
如果Linq Count方法实现了ICollection接口,并且因此已经具有Count属性,那么它非常聪明,不会迭代底层集合。
计数在IEnumerable
上的实现首先检查可枚举列表是否也实现了ICollection<T>
,其中T是可枚举列表的泛型参数。
如果是,则返回ICollection<T>.Count
。
如果不是,则检查是否实现了ICollection
。如果是,则返回ICollection.Count
。
如果它既不实现这两个,就必须遍历整个列表和计数,对于大列表来说,这可能是一个昂贵的操作。
CCD_ 13实现CCD_ 14,因此性能将是相同的。
我假设它是这样工作的:List在变量中保留自己的计数。Count((在IEnumerable中循环以计算元素的数量。这将使List.Count更有效率。