Я использую Spring4D для всех коллекций.Как реализовать перечислитель с функциями IsFirst и IsLast?
Теперь возникает ситуация, когда я должен знать, является ли текущее значение перечислителя первым (что легко) или последним (что сложно) в коллекции.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Spring.Collections;
var
Enumerable: IEnumerable<Integer>;
Enumerator: IEnumerator<Integer>;
begin
Enumerable := TEnumerable.Query<Integer>(TArray<Integer>.Create(1, 2, 3, 4, 5)
) as IEnumerable<Integer>;
Enumerator := Enumerable.GetEnumerator;
while Enumerator.MoveNext do
begin
WriteLn('Value = ', Enumerator.Current);
WriteLn('First in collection? ', Enumerator.CurrentIsFirst);
WriteLn('Last in collection? ', Enumerator.CurrentIsLast);
end;
ReadLn;
end.
CurrentIsFirst
может быть реализован с использованием локального Boolean, который сбрасывается после того, как первое значение прошло.
Однако я не знаю простого способа реализовать CurrentIsLast
.
Он должен иметь возможность обрабатывать ленивые коллекции, так как они могут содержать слишком много значений для вставки в память.
Как я могу реализовать такую функцию CurrentIsLast
?
Мне до сих пор интересно, чего вы пытаетесь достичь с помощью знания, если элемент является первым или последним, и он не может быть полностью решен. –
Мы используем его для несколько необычной формы [перерыва управления] (https://en.wikipedia.org/wiki/Control_break). –
Как я уже сказал, может быть другой способ сделать это - например, в связанной с ней статье в википедии говорится о группировке, которую можно сделать с помощью TEnumerable.GroupBy. –