diff --git a/MoreLinq/Lag.cs b/MoreLinq/Lag.cs index 51cdf5808..e0afdbd63 100644 --- a/MoreLinq/Lag.cs +++ b/MoreLinq/Lag.cs @@ -66,31 +66,12 @@ public static IEnumerable Lag(this IEnumerable _() { - using var iter = source.GetEnumerator(); - - var i = offset; var lagQueue = new Queue(offset); - // until we progress far enough, the lagged value is defaultLagValue - var hasMore = true; - // NOTE: The if statement below takes advantage of short-circuit evaluation - // to ensure we don't advance the iterator when we reach the lag offset. - // Do not reorder the terms in the condition! - while (i-- > 0 && (hasMore = iter.MoveNext())) - { - lagQueue.Enqueue(iter.Current); - // until we reach the lag offset, the lagged value is the defaultLagValue - yield return resultSelector(iter.Current, defaultLagValue); - } - - if (hasMore) // check that we didn't consume the sequence yet + foreach (var value in source) { - // now the lagged value is derived from the sequence - while (iter.MoveNext()) - { - var lagValue = lagQueue.Dequeue(); - yield return resultSelector(iter.Current, lagValue); - lagQueue.Enqueue(iter.Current); - } + var lagValue = lagQueue.Count == offset ? lagQueue.Dequeue() : defaultLagValue; + yield return resultSelector(value, lagValue); + lagQueue.Enqueue(value); } } } diff --git a/MoreLinq/Lead.cs b/MoreLinq/Lead.cs index dc5a9c391..45202ff45 100644 --- a/MoreLinq/Lead.cs +++ b/MoreLinq/Lead.cs @@ -65,22 +65,13 @@ public static IEnumerable Lead(this IEnumerable _() { var leadQueue = new Queue(offset); - var iter = source.GetEnumerator(); - - bool hasMore; - // first, prefetch and populate the lead queue with the next step of - // items to be streamed out to the consumer of the sequence - while ((hasMore = iter.MoveNext()) && leadQueue.Count < offset) - leadQueue.Enqueue(iter.Current); - // next, while the source sequence has items, yield the result of - // the projection function applied to the top of queue and current item - while (hasMore) + foreach (var value in source) { - yield return resultSelector(leadQueue.Dequeue(), iter.Current); - leadQueue.Enqueue(iter.Current); - hasMore = iter.MoveNext(); + if (leadQueue.Count == offset) + yield return resultSelector(leadQueue.Dequeue(), value); + leadQueue.Enqueue(value); } - // yield the remaining values in the lead queue with the default lead value + while (leadQueue.Count > 0) yield return resultSelector(leadQueue.Dequeue(), defaultLeadValue); }