为什么?我该如何解决?
答案 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服务调用。现在,如果它只是一个内存中的集合,那它并不是一个真正的问题,因为枚举集合不会有明显的副作用。无论如何,如果序列实现Any
,Count
将使用ICollection<T>
属性,因此它不会导致枚举。