Sobes.tech
Назад к вопросам
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);

Компании, где спрашивали
PyrusPyrus

Ответ от нейросети

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 элементов из последовательности без полного перебора или создания промежуточных коллекций.