有时Resharper警告:
IEnumerable的可能的多个枚举
关于如何处理此问题,有一个SO问题,ReSharper网站也在此处进行了说明。它有一些示例代码告诉您执行以下操作:
IEnumerable<string> names = GetNames().ToList();
我的问题是关于这个具体建议的:这是否还会导致在2个for-each循环中两次对集合进行枚举?
Answers:
GetNames()
返回IEnumerable
。因此,如果您存储该结果:
IEnumerable foo = GetNames();
然后,每次您枚举时foo
,GetNames()
都会再次调用该方法(从字面上看,我找不到正确解释其细节的链接,但请参阅IEnumerable.GetEnumerator()
)。
Resharper看到了这一点,并建议您将枚举的结果存储GetNames()
在局部变量中,例如通过在列表中实现它:
IEnumerable fooEnumerated = GetNames().ToList();
GetNames()
只要您参考,这将确保结果仅被枚举一次fooEnumerated
。
这很重要,因为您通常只想枚举一次,例如在GetNames()
执行(缓慢的)数据库调用时。
因为你物化在清单的结果,无所谓了,你枚举fooEnumerated
两次; 您将遍历一个内存列表两次。
我发现这是理解多个枚举的最好,最简单的方法。
C#LINQ:IEnumerable的可能的多个枚举
https://helloacm.com/c-linq-possible-multiple-enumeration-of-ienumerable-resharper/
是的,毫无疑问,您将对其进行两次枚举。但是要点是,如果GetNames()
返回一个懒惰的linq查询,该查询的计算非常昂贵,那么它将在不调用or的情况下进行两次计算。ToList()
ToArray()