時々、列挙型を複数回処理する必要がある状況です。列挙が高価で反復不可能で、(データベースから読み取るIQueryableのような)多数のデータを生成する場合、複数の列挙はオプションではなく、結果をメモリにバッファリングしません。
今日まで、foreachループでアイテムをプッシュして結果を読み取ることができるアグリゲータクラスを作成してしまいました.LINQよりははるかにエレガントです。
しかし、私はちょうど "プッシュ"と言ったのですか?それは反応するようには聞こえませんか?だから私は今夜の散歩中に考えていた。私はそれを試してみました - それは動作します!
例スニペットが受信(Rxのもの、つまり)標準LINQ演算子を使用して、単一パスの整数の配列から最小値および最大アイテムの両方を取得する方法を示しています。
public static MinMax GetMinMax(IEnumerable<int> source)
{
// convert source to an observable that does not enumerate (yet) when subscribed to
var connectable = source.ToObservable(Scheduler.Immediate).Publish();
// set up multiple consumers
var minimum = connectable.Min();
var maximum = connectable.Max();
// combine into final result
var final = minimum.CombineLatest(maximum, (min, max) => new MinMax { Min = min, Max = max });
// make final subscribe to consumers, which in turn subscribe to the connectable observable
var resultAsync = final.GetAwaiter();
// now that everybody is listening, enumerate!
connectable.Connect();
// result available now
return resultAsync.GetResult();
}
これはありません"IEnumerableでLinqメソッドを複数回呼び出すことはできますか?"という質問に答えてください。 ... 答えはいいえだ"。 –
さて、「OK」とは、少し不明であることを意味します。あなたは何回でもリストを反復することができます。私は私の答えでこれの結果を言及します。どのようにそれらを反復することができないのですか?もしあなたがそうだと思うなら、あなた自身の答えを投稿してください(すでに受け入れられている回答があります)。 –
これは完全にはっきりしています。 'items'はIEnumerableであり、リストではありません。あなたはそれを一度しかトラバースできません。別の回答を投稿する必要はありませんが、読者はこの回答が間違っていて、質問に触れていないことを理解することが重要です。 –