C# IList的计数方法或属性

C# IList的计数方法或属性,c#,C#,感谢您帮助我解释IList和IEnumerable。我已将此标记为已回答。现在我有一个请求,只是想了解更多的信息 我有这样的代码: for (var index = 0; index < Model.Items.Count(); index++) Count()方法调用实际上调用了静态方法。这是为IList实现使用该属性而优化的,但这需要动态类型检查,并且最终仍然会检查该属性,因此使用该属性肯定更有效。在.NET 3.5中,它仅针对ICollection进行优化,而在.NET 4中,它

感谢您帮助我解释IList和IEnumerable。我已将此标记为已回答。现在我有一个请求,只是想了解更多的信息

我有这样的代码:

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++) { }