3

パラメータを通常の配列から同じタイプの 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その結果を関数によって遅延して取得したコレクションとは対照的です)。

  • さまざまな LINQ 関数の結果を渡したいためにメソッド シグネチャを取得に変更することIEumerable<MyObject>が理にかなっている場合はToList、メソッド内で変換します。
  • 配列に加えて他のコレクションを渡す必要がある場合は、ICollection<MyObject>代わりに を使用しますIEumerable<MyObject>
  • 変換が純粋に審美的な理由によるものである場合、つまり署名を変更しても配列を渡し続ける場合は、警告を完全に無視できます。
于 2012-08-18T13:47:44.503 に答える