Last()
llamarán GetEnumerator()
, a continuación, seguir llamando MoveNext()
/Current
hasta MoveNext()
vuelve falsa, momento en el que se devuelve el último valor de Current
recuperado. La nulidad no se usa como un terminador en secuencias, generalmente.
Así que la aplicación podría ser algo como esto:
public static T Last<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
using (IEnumerator<T> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
throw new InvalidOperationException("Empty sequence");
}
T value = iterator.Current;
while (iterator.MoveNext())
{
value = iterator.Current;
}
return value;
}
}
(Esto podría ser implementado con un bucle foreach
, pero lo anterior muestra la interacción de manera más explícita Esto también ignora la posibilidad de acceder al último elemento directamente. .)
Estás confundiendo secuencias con sus enumeradores. Imagina un libro con páginas numeradas. Esa es una secuencia. Imagine un marcador, marcando una página en particular. Eso es un enumerador. Puede tener cientos de marcadores en un libro si lo desea, todos marcando diferentes lugares. Llamando a GetEnumerator.Current está pidiendo la página en la que está marcado un marcador cuando aún no lo has incluido en el libro; no hagas eso –