Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerable的可能多重枚举?_C#_.net 4.0_Resharper_Enumeration - Fatal编程技术网

C# IEnumerable的可能多重枚举?

C# IEnumerable的可能多重枚举?,c#,.net-4.0,resharper,enumeration,C#,.net 4.0,Resharper,Enumeration,为什么呢?我怎样才能修复它?这里没有什么可修复的Any()将迭代枚举,但在第一个元素之后停止(之后返回true) 在两种情况下,多重枚举主要是一个问题: 性能:通常,如果需要,您希望避免多次迭代 可以,因为它比较慢。这不适用于此处,因为Any()将 只需确认至少有一个元素,并且是您所需的检查。此外,您没有访问任何远程/外部资源,只是访问内存中的序列 不能多次迭代的枚举:例如。 从网络等接收项目-此处也不适用 作为只需迭代一次的非Linq版本,您可以执行以下操作: bool foundAny=


为什么呢?我怎样才能修复它?

这里没有什么可修复的
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;

但是,如前所述,在您的情况下,这没有什么区别,我会选择对您来说更可读的版本。

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

除了最后的屏幕截图和文本之外,其他所有内容都会分散对真实问题的注意力。这与。Any()将被算作一个枚举,Aggregate()将被算作第二个枚举。不要以截图的形式发布代码——将源代码粘贴到问题中。这条消息以前在StackOverflow上出现过——以下两个问题可能会澄清您的情况:如果这是一个数据库查询,它将执行两次,通常是完全执行。@usr:同意,我在第一个案例中添加了这一点——在这种情况下,无论它是远程/外部资源还是内存序列,都会有所不同