finiteList.Reverse().Take(count).Reverse();
ou
finiteList.Skip(finiteList.Count() - count)
Il y a certains frais généraux, ce faisant, si une méthode personnalisée serait mieux.
Mise à jour: Une méthode personnalisée
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;
}
}
Mise à jour: modifié le code d'un littlebit avec des idées de dtb's répondre :-)
Commentaire Bear: Regardez ce exemple:
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...
Vous pourriez pote changer les valeurs de lastFive2
et donc cette approche peut être dangereuse ou du moins ce n'est pas la manière fonctionnelle.
à BEAR:
Ce que je voulais dire au sujet de la sécurité est la suivante:
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?
Dans ces cas, vous auriez à faire une copie pour être sûr. Mais dans la plupart des cas, votre façon serait bien - et un peu plus efficace que cela pour +1 :)
Une idée est d'utiliser une file d'attente qui n'ont Enqueue interne, etc.
Aïe, ça va travailler, mais ça ne va pas être efficace, ni élégant. – Mark
@Mark Comme je le dis, je suis d'accord avec vous :) Je vais trouver une méthode plus efficace ... –
Aussi, en fonction de ce que 'finiteList' est, il peut même être POSSIBLE de l'énumérer deux fois (ce qui votre deuxième suggestion exigerait) – Mark