可能多次枚举IEnumerable?

时间:2012-03-03 20:15:41

标签: c# .net-4.0 resharper enumeration

enter image description here

为什么?我该如何解决?

2 个答案:

答案 0 :(得分:17)

这里没有什么可以解决的。 Any()将迭代枚举但在第一个元素之后停止(之后它返回true)。

在两种情况下,多次枚举主要是一个问题:

  • 性能:一般来说,如果你想避免多次迭代 可以,因为它比较慢。这不适用于此Any() 只需确认至少有一个元素,并且是您的必需支票。此外,您不是访问任何远程/外部资源,只是内存序列。

  • 无法多次迭代的枚举:例如 从网络接收物品等 - 此处也不适用。

作为非Linq版本,只需在 执行以下操作后进行迭代:

bool foundAny= false;
bool isEqual = true;

if(f == null)
  throw new ArgumentException();

foreach(var check in f)
{
   foundAny = true;
   isEqual = isEqual && check(p,p2);
}

if(!foundAny)
  throw new ArgumentException();

return isEqual;

但是,如上所述,在你的情况下,它没有什么区别,我会选择更易读的版本。

答案 1 :(得分:5)

Any方法可能导致IEnumerable<T>的枚举,如果它没有其他方法来确定结果。在某些情况下,它可能是一个问题,例如,如果IEnumerable<T>实例实际上是IQueryable<T>,将导致执行数据库查询或Web服务调用。现在,如果它只是一个内存中的集合,那它并不是一个真正的问题,因为枚举集合不会有明显的副作用。无论如何,如果序列实现AnyCount将使用ICollection<T>属性,因此它不会导致枚举。