Sax*_*man 97 .net c# linq list count
给定一个列表,首选哪个方法来确定里面的元素数量?
var myList = new List<string>();
myList.Count
myList.Count()
Run Code Online (Sandbox Code Playgroud)
BFr*_*ree 120
Count()
是LINQ引入的扩展方法,而Count
属性是List本身的一部分(派生自ICollection
).但在内部,LINQ会检查您的IEnumerable
工具ICollection
是否使用该Count
属性.所以在一天结束时,你使用哪一个没有区别List
.
为了进一步证明我的观点,这里是Reflector的代码 Enumerable.Count()
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;
}
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 24
对扩展方法的类型总是更喜欢Count
和Length
属性Count()
.前者是包含它们的每种类型的O(1).该Count()
扩展方法有一些类型检查的优化,可以使其在O(1)时间也运行,但会降低到O(N),如果底层集合是不是知道的少数类型之一.
Ian*_*ose 10
myList.Count是列表对象上的一个方法,它只返回一个字段的值,所以非常快.由于它是一个很小的方法,它很可能被编译器(或运行时)内联,然后它们可以允许编译器完成其他优化.
myList.Count()正在调用一个扩展方法(由LINQ引入),它循环遍历IEnumerabl中的所有项目,所以应该慢得多.
但是(在Microsoft实现中)Count扩展方法对Lists有一个"特殊情况",允许它使用列表的Count属性,这意味着Count()方法只比Count属性慢一点.
在大多数应用程序中,您很可能无法区分速度差异.
因此,如果您知道您正在处理List使用Count属性,否则如果您有一个"未知"IEnumerabl,请使用Count()方法并让它为您进行优化.
归档时间: |
|
查看次数: |
133957 次 |
最近记录: |