3

我有很多 resharper 警告将我的参数从常规数组更改为相同类型的 IEnumerable,因此它会改变这一点:

 public Interface IGenerator
 {
       void Go(MyObject[] objects) 
 }

对此:

 public Interface IGenerator
 {
       void Go(IEumerable<MyObject> objects) 
 }

如果我去更改所有这些,那么每当我在函数内部调用 .Where() 时都会收到其他警告,并带有警告:

  Possible multiple enumeration of IEnumerable

我看到了这个错误描述,但是这些已经是数组,所以没有延迟查询。

那么这里推荐的做法是什么?我应该将其保留为数组还是在整个位置添加 .ToList() 以删除多个可枚举错误

4

1 回答 1

1

“多重枚举”不是错误,而是警告(如果我没记错的话,这是一个更尖锐的警告)。如果您确定您传递了“物化”集合(与惰性获得的集合相反,例如通过作为yield return其结果的函数),您可以忽略它。

  • 如果将方法签名更改为 takeIEumerable<MyObject>是有意义的,因为您想传递各种 LINQ 函数的结果,然后ToList在您的方法中进行转换。
  • 如果您需要传递除数组之外的其他集合,请使用ICollection<MyObject>而不是IEumerable<MyObject>.
  • 如果转换纯粹是出于审美原因,即您更改签名但继续传递数组,则可以完全忽略警告。
于 2012-08-18T13:47:44.503 回答