finiteList.Reverse().Take(count).Reverse();
o
finiteList.Skip(finiteList.Count() - count)
Existe cierta sobrecarga en hacer esto por lo que un método personalizado sería mejor.
Actualización: Un método personalizado
public static class EnumerableExtensions
{
public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int count)
{
if (source == null) throw new ArgumentNullException("source");
if (count < 0) throw new ArgumentOutOfRangeException("count");
if (count == 0) yield break;
var queue = new Queue<T>(count);
foreach (var t in source)
{
if (queue.Count == count) queue.Dequeue();
queue.Enqueue(t);
}
foreach (var t in queue)
yield return t;
}
}
Actualización: cambiado el código littlebit con las ideas de dtb's contestar :-)
comentario a Bear: Mira esto ejemplo:
var lastFive = Enumerable.Range(1, 10).TakeLast(5);
var lastFive2 = Enumerable.Range(1, 10).TakeLast2(5); //Bear´s way
Queue<int> q = (Queue<int>)lastFive2;
q.Dequeue();
//Is lastFive2 still last five? no...
Usted podría pote cambiar los valores de lastFive2
y, por lo tanto, ese enfoque puede ser inseguro o al menos no es la forma funcional.
de llevar
Lo que quería decir sobre el seguro es la siguiente:
var lastFive2 = Enumerable.Range(1, 10).TakeLast2(5); //Bear´s way
//some = Some method which you don't control - it could be from another assembly which represents a crazy plugin etc.
some(lastFive2);
//Now what?
En estos casos se tendría que hacer una copia para estar seguro. Pero en la mayoría de los casos, su forma sería muy bien - y un poco más eficiente que este modo :) 1
Una idea es utilizar una cola que sólo tiene interno Enqueue etc.
Huy, eso funciona, pero no va a ser eficiente ni elegante. – Mark
@Mark Como señalo, estoy de acuerdo contigo :) Voy a llegar a un método más eficiente ... –
Además, dependiendo de lo que 'finiteList' es, puede o no ser POSIBLE enumerarlo dos veces (lo cual su segunda sugerencia requeriría) – Mark