C# IList的计数方法或属性
感谢您帮助我解释IList和IEnumerable。我已将此标记为已回答。现在我有一个请求,只是想了解更多的信息 我有这样的代码:C# IList的计数方法或属性,c#,C#,感谢您帮助我解释IList和IEnumerable。我已将此标记为已回答。现在我有一个请求,只是想了解更多的信息 我有这样的代码: for (var index = 0; index < Model.Items.Count(); index++) Count()方法调用实际上调用了静态方法。这是为IList实现使用该属性而优化的,但这需要动态类型检查,并且最终仍然会检查该属性,因此使用该属性肯定更有效。在.NET 3.5中,它仅针对ICollection进行优化,而在.NET 4中,它
for (var index = 0; index < Model.Items.Count(); index++)
Count()
方法调用实际上调用了静态方法。这是为IList
实现使用该属性而优化的,但这需要动态类型检查,并且最终仍然会检查该属性,因此使用该属性肯定更有效。在.NET 3.5中,它仅针对ICollection
进行优化,而在.NET 4中,它也针对非泛型ICollection
进行优化。有关更多详细信息,请参阅
至于你问题的最后一点:foreach
循环可能更有效,也可能不更有效,但在我看来,它更具可读性,这一点更为重要。除非您真的需要每个条目的索引,否则我肯定会使用foreach
。Count()
扩展方法适用于所有支持IEnumerable
的对象,并且由于IEnumerable
本身没有任何方法来报告项目计数,它可能必须使用它的IEnumerator
在IEnumerable
实例上迭代,如果多次调用,这可能会对性能造成真正的影响
但是,如果您查看Count()
实现,您将看到它针对ICollection
类型进行了优化(泛型和非泛型,至少在FW4.0中,这意味着IList
和IList
也进行了优化),并且如果您的对象实现了ICollection
(在count
属性中报告项目计数),count()
方法返回项计数而不遍历集合。这就是为什么您看不到性能差异。不过,如果您知道有ICollection
或IList
实例,为什么不直接获取count
属性并独立于count()
方法实现
另外,请记住,您可以在变量中缓存Count()
方法的返回值,以抑制多个调用:
var count = Model.Items.Count();
for(var index = 0; index < count; index++) { }
var count=Model.Items.count();
对于(var index=0;index
请将链接放在您之前的问题上。谢谢Jon。foreach是否需要IList或IEnumerable?@Samantha2:严格来说,实际上并不需要IList或IEnumerable,但IEnumerable
(或IEnumerable
)足以保证您可以使用foreach
。
foreach(var item in Items)
var count = Model.Items.Count();
for(var index = 0; index < count; index++) { }