遅延列挙オブジェクトを返す関数があるとします。
struct AnimalCount
{
int Chickens;
int Goats;
}
IEnumerable<AnimalCount> FarmsInEachPen()
{
....
yield new AnimalCount(x, y);
....
}
また、2 つの別個の を消費する 2 つの関数もありますIEnumerable
。次に例を示します。
ConsumeChicken(IEnumerable<int>);
ConsumeGoat(IEnumerable<int>);
どうすれば、a) ToList() を事前に変換せずに呼び出すことができますかConsumeChicken
。ConsumeGoat
これFarmsInEachPen()
は、2 つの無数のレコードがある可能性があるためです。b) マルチスレッドはありません。
基本的:
ConsumeChicken(FarmsInEachPen().Select(x => x.Chickens));
ConsumeGoats(FarmsInEachPen().Select(x => x.Goats));
しかし、二重列挙を強制することなく。
マルチスレッドで解決できますが、各リストのバッファ キューで不必要に複雑になります。
だから私は完全に評価せずにAnimalCount
列挙子を2つの列挙子に分割する方法を探しています。ロックステップで一緒に実行しても問題ありません。int
AnimalCount
ConsumeGoat
ConsumeChicken
すぐに解決策を感じることができますが、まだそこにはいません。IEnumerable
私は、フィードされたものを返すヘルパー関数の方針に沿って考えていConsumeChicken
ます。イテレータが使用されるたびに、内部的に が呼び出されConsumeGoat
、2 つの関数がロックステップで実行されます。もちろん、私は何ConsumeGoat
度も電話したくありません..