IEnumerable
Count()
和Length
之间的主要区别是什么?IEnumerable Count()和Length之间的区别
回答
通过致电IEnumerable<T>
计数我假设您指的是System.Linq.Enumerable
上的扩展方法Count
。 Length
不是IEnumerable<T>
上的方法,而是.Net中阵列类型的属性,例如int[]
。
不同之处在于性能。 Length
属性保证是O(1)操作。 Count
扩展方法的复杂性根据对象的运行时类型而有所不同。它将尝试通过Count
属性投射到支持O(1)长度查找的若干类型,如ICollection<T>
。如果没有可用的,那么它将枚举所有项目并计数它们的复杂度为O(N)。
例如
int[] list = CreateSomeList();
Console.WriteLine(list.Length); // O(1)
IEnumerable<int> e1 = list;
Console.WriteLine(e1.Count()); // O(1)
IEnumerable<int> e2 = list.Where(x => x <> 42);
Console.WriteLine(e2.Count()); // O(N)
值e2
被实现为不支持O(1)的计数,因此该方法必须Count
枚举整个集合,以确定它是多久一个C#迭代器。
对Jon Skeet的评论很少。
有Count()
扩展方法的源代码:
.NET 3:
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;
}
.NET 4:
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;
}
请注意,在.NET 4中还有另一个块来检查非泛型'ICollection'类型。 (因为它也有一个'Count'属性。) – 2010-03-26 07:37:28
@Jon Skeet:谢谢 – bniwredyc 2010-03-26 07:58:30
有没有人知道'使用'来得到这个方法使用的'Error'类?我似乎无法在MSDN上的任何地方找到它,除了JScript文档。 – 2012-06-10 20:50:44
长度是固定的属性,例如的单维数组或字符串。因此,从不需要计数操作(多维数组的所有维度的大小都相乘)。这里的O(1)操作意味着无论有多少元素,检索时间总是相同的。线性搜索(与此相反)是O(n)。
上ICollections Count属性(列表和列表<牛逼>,例如)可以改变的,所以它要么被上添加更新/删除操作,或当收集起来之后要求的次数已经改变。取决于对象的实现。 (除了当对象是一个ICollection类型,然后ICollection.Count属性被请求时)。LINQ的Count()方法基本上遍历每一个被调用的时间(除非对象是ICollection类型,则ICollection.Count属性被请求)。
注意IEnumerables往往不是已经定义的对象集合(如列表,数组,哈希表等),但链接后台操作,无论何时都要求他们能产生结果(被称为延迟执行)。
通常情况下,你有一个像LINQ声明是这样的(延迟执行的典型应用)的SQL:
IEnumerable<Person> deptLeaders =
from p in persons
join d in departments
on p.ID equals d.LeaderID
orderby p.LastName, p.FirstName
select p;
然后,有这样的代码:
if (deptLeaders.Count() > 0)
{
ReportNumberOfDeptLeaders(deptLeaders.Count());
if (deptLeaders.Count() > 20)
WarnTooManyDepartmentLeaders(deptLeaders.Count());
}
所以,当一个警告由于发布了太多的部门领导,.NET通过这些人走过了四次,与部门领导进行核对,按名称对它们进行排序,然后对结果对象进行计数。
这只有当个人和部门是预设值集合,而不是查询本身。
- 1. IQueryable和IEnumerable中的.Count()之间的区别
- 2. PDO:rowCount()和SQL COUNT(col)之间的区别
- 3. JQuery .length()和.NET之间的区别返回的长度为
- 4. StringBuilder中的length()和capacity()方法之间的区别
- 5. 在Perl中,“if defined $ count”和“if $ count”之间有什么区别?
- 6. “hello”.length和“hello”.length是什么区别?
- 7. 在ICU UnicodeString中countChar32()和length()之间有什么区别?
- 8. OpenCL函数length()和fast_length()之间有什么区别?
- 9. 区别:d [count]和d [count]
- 10. C#中IEnumerable类的foreach和for循环之间的区别
- 11. IQueryable的Contains()和IEnumerable的Contains()之间有什么区别?
- 12. IEnumerable和Array,IList和List之间有什么区别?
- 13. IQueryable和IEnumerable之间的区别是什么
- 14. Hashing vectorizer和Count vectorizer之间的区别是什么?
- 15. C#中可观察集合中Count和Count()之间的区别是什么?
- 16. JSP中LENGTH与fn:长度(...)之间的区别EL
- 17. '+ ='和'= +'之间的区别?
- 18. {!!之间的区别!!}和{{}}
- 19. ==和case之间的区别?
- 20. '#','%'和'$'之间的区别
- 21. | =和^ = css之间的区别
- 22. “%〜dp0”和“。\”之间的区别?
- 23. .eq之间的区别。和==
- 24. ==和.equals()之间的区别?
- 25. `%in%`和`==`之间的区别
- 26. 列表和序列之间的区别
- 27. 成本函数,sum(x)和ones(1,length(x))* x之间的区别是什么?
- 28. SPFile和PublishingPage类别之间的区别
- 29. System.Timers.Timer Enabled = true和.Start()之间的区别Enabled = true和.Start()之间的区别
- 30. NSthread和NStimer和NSNotifcation之间的区别?
'List'没有Length属性 - 它有一个Count属性。数组虽然有一个“长度”。 “计数”在“ICollection”和“ICollection ”(其中IList 延伸)中指定。 –
2010-03-26 07:15:43
@Jon,doh。在这里要归咎于睡眠不足。将更新 – JaredPar 2010-03-26 07:18:01
如果您的'IEnumerable'是无限长的,'Count()'永远不会返回... –
2010-03-26 08:05:27