Uso de Linq; ¿Cómo puedo hacer lo "opuesto" a Take?Linq: ¿El "opuesto" de Take?
I.e. en lugar de obtener los primeros n elementos, como en
aCollection.Take(n)
Quiero obtener todo excepto los últimos n elementos. Algo así como
aCollection.Leave(n)
(No pregunte por qué :-)
Editar
supongo que puedo hacerlo de esta manera aCollection.TakeWhile((x, index) => index < aCollection.Count - n)
o en la forma de una extensión
public static IEnumerable<TSource> Leave<TSource>(this IEnumerable<TSource> source, int n)
{
return source.TakeWhile((x, index) => index < source.Count() - n);
}
Pero en el caso de Linq a SQL o NHibernate Linq habría sido nic e si el SQL generado se encargó de eso y generó algo así como (para SQL Server/T-SQL)
SELECT TOP(SELECT COUNT(*) [email protected] FROM ATable) * FROM ATable
O alguna otra implementación de SQL más inteligente.
Supongo que no hay nada como eso? (. Sin embargo, la edición fue en realidad no es parte de la pregunta)
Nota: Esta no es la misma que Skip ! –
Wow, ustedes son rápidos! Parece que la respuesta de Shedal y Jim Dagg es la mejor para mi propósito. ¿Cómo sé cuál de estos seleccionar como respuesta correcta? Jim fue más rápido, pero Shedal obtuvo los votos. –
Acepta la respuesta de Shedal. Reverse no funcionará en la base de datos, ya que la base de datos necesita un calificador en el campo que desea clasificar, tiene un error de tiempo de ejecución cuando lo probaba en ORM. Probé el código de Shedal en ORM, su código funciona bien –