使用.GetType()可能多次枚举IEnumerable警告

时间:2012-01-17 08:26:06

标签: c# linq resharper enumerator gettype

我收到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()”语句被识别为查询。

有什么建议吗?

提前感谢。

2 个答案:

答案 0 :(得分:3)

只是Resharper不够聪明。 GetType不是虚拟方法,不会影响IEnumerable

答案 1 :(得分:0)

为了调用GetTypes,需要从ReSharper的角度评估entities(它不知道GetTypes是否需要对枚举进行评估,这就是为什么它说“可能多次枚举”)。由于ReSharper发现方法中有多个位置具有相同的方案,因此会发出此警告。

这可能是也可能不是问题,具体取决于entities表示的内容以及您对其执行的操作。如果它表示内存中的数组,或者您执行的操作不会迭代列表,则不必担心。如果你对它进行迭代,并且它代表了一个将转到数据库的查询,那么明确枚举它(通过调用ToListToArray)并对其结果进行处理可能是件好事。< / p>