Назад к вопросам
Pyrus
Middle+
5
var buf = new Queue<T>(); foreach (T i in source) { buf.Enqueue(i); if (buf.Count > n) yield return buf.Dequeue(); } // source.Count == 11 var x = FilterLast(source, 3).Take(4);
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Этот код реализует фильтрацию последовательности, пропуская первые n элементов и начиная выдавать элементы с позиции n+1.
Объяснение:
- В очередь
bufдобавляются элементы изsourceпо одному. - Если размер очереди превышает
n, то из неё извлекается (и возвращается черезyield return) самый старый элемент.
Таким образом, первые n элементов не возвращаются, а последующие — да.
В вашем примере source.Count == 11, n == 3, значит первые 3 элемента пропускаются, а начиная с 4-го элемент будет возвращён.
Выражение FilterLast(source, 3).Take(4) вернёт 4 элемента, начиная с 4-го по 7-й из исходной последовательности.
Пример функции:
IEnumerable<T> FilterLast<T>(IEnumerable<T> source, int n)
{
var buf = new Queue<T>();
foreach (var i in source)
{
buf.Enqueue(i);
if (buf.Count > n)
yield return buf.Dequeue();
}
}
// Использование:
var result = FilterLast(source, 3).Take(4);
Это полезно, когда нужно отфильтровать первые n элементов из последовательности без полного перебора или создания промежуточных коллекций.