2012-03-03 38 views
9

enter image description hereIEnumerable可能的多次枚举?

这是为什么?我该如何解决它?

+1

除了最终的截图和文本以外,所有内容都只是分散了真正的问题。 – usr 2012-03-03 20:19:26

+1

这与http://stackoverflow.com/q/7244178/219583非常相似。任何()将作为第二个枚举和Aggregate()。 – 2012-03-03 20:20:43

+9

请勿将代码张贴为截图 - 将源代码粘贴到问题中。 – Joe 2012-03-03 20:25:37

回答

14

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

如果这是一个数据库查询它会执行两次,通常完全。 – usr 2012-03-03 20:27:19

+1

@usr:同意,我补充说,对于第一种情况 - 无论是远程/外部资源还是内存中顺序 – BrokenGlass 2012-03-03 20:30:18

5

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