我收到ReSharper警告“可能多次枚举IEnumerable”,代码如下:
public void Mymethod(IEnumerable<int> entities)
{
var enumerator = entities.GetEnumerator();
var entityType = entities.GetType();
}
与描述的多个stackoverflow主题(以及http://confluence.jetbrains.net/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable)一样,ReSharper认识到查询运行了两次。
我的问题是,为什么“GetType()”语句被识别为查询。
有什么建议吗?
提前感谢。
答案 0 :(得分:3)
只是Resharper不够聪明。 GetType
不是虚拟方法,不会影响IEnumerable
。
答案 1 :(得分:0)
为了调用GetTypes
,需要从ReSharper的角度评估entities
(它不知道GetTypes
是否需要对枚举进行评估,这就是为什么它说“可能多次枚举”)。由于ReSharper发现方法中有多个位置具有相同的方案,因此会发出此警告。
这可能是也可能不是问题,具体取决于entities
表示的内容以及您对其执行的操作。如果它表示内存中的数组,或者您执行的操作不会迭代列表,则不必担心。如果你对它进行迭代,并且它代表了一个将转到数据库的查询,那么明确枚举它(通过调用ToList
或ToArray
)并对其结果进行处理可能是件好事。< / p>