finiteList.Reverse().Take(count).Reverse();
hoặc
finiteList.Skip(finiteList.Count() - count)
Có một số chi phí trong việc này do đó, một phương pháp tùy chỉnh sẽ tốt hơn.
Cập nhật: Một phương pháp tùy chỉnh
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;
}
}
Cập nhật: Thay đổi mã một littlebit với ý tưởng từ dtb's trả lời :-)
Comment Bear: Nhìn này ví dụ:
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...
Bạn có thể pote ntially thay đổi các giá trị của lastFive2
và do đó phương pháp tiếp cận đó có thể không an toàn hoặc ít nhất nó không phải là cách chức năng.
Để Bear:
Những gì tôi có nghĩa là về an toàn là thế này:
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?
Trong những trường hợp này bạn sẽ phải tạo một bản sao để đảm bảo. Nhưng trong hầu hết trường hợp theo cách của bạn sẽ là tốt - và hiệu quả hơn một chút so với này để 1 :)
Một ý tưởng là sử dụng một hàng đợi mà chỉ có nội Enqueue, vv
Nguồn
2010-09-23 17:09:04
Yikes, mà sẽ công việc, nhưng nó sẽ không hiệu quả, cũng không phải thanh lịch. – Mark
@Mark Khi tôi nói, tôi đồng ý với bạn :) Tôi sẽ đưa ra một phương pháp hiệu quả hơn ... –
Ngoài ra, tùy thuộc vào 'finiteList' là gì, có thể hoặc thậm chí không thể liệt kê nó hai lần (đề nghị thứ hai của bạn sẽ yêu cầu) – Mark