可能多次枚举IEnumerable?

在此处输入图像描述

这是为什么 ? 我该怎么解决?

这里没有什么可以解决的。 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; 

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

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