Giới thiệu
Kết hợp phương thức Reverse() và Take() trong LINQ để lấy N phần tử cuối cùng của một List và đảo ngược thứ tự của chúng.
Ví dụ cơ bản
Khởi tạo List:
ListmyList = new List (); myList.Add("One"); myList.Add("Two"); myList.Add("Three"); myList.Add("Four");
Lấy 3 phần tử cuối và đảo ngược:
myList.Reverse().Take(3);
Ví dụ hoàn chỉnh
using System;
using System.Linq;
using System.Collections.Generic;
public class Demo
{
public static void Main()
{
List myList = new List();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");
myList.Add("Four");
// Lấy 3 phần tử cuối (Four, Three, Two) và đảo ngược -> Two, Three, Four?
// Lưu ý: Reverse() đảo ngược toàn bộ list, sau đó Take(3) lấy 3 phần tử đầu của list đã đảo.
// List gốc: One, Two, Three, Four
// Sau Reverse: Four, Three, Two, One
// Take(3): Four, Three, Two
var res = myList.Reverse().Take(3);
foreach (string str in res)
{
Console.WriteLine(str);
}
}
}
Kết quả
Four Three Two
Giải thích logic
- List gốc:
[One, Two, Three, Four] Reverse():[Four, Three, Two, One]Take(3):[Four, Three, Two]
Cách khác: Dùng Skip + Take
// Lấy 3 phần tử cuối mà không đảo ngược list gốc var lastThree = myList.Skip(Math.Max(0, myList.Count - 3)).Take(3); // Kết quả: Three, Four (nếu Count=4, Skip(1) -> Two, Three, Four? Wait) // Count=4, Skip(1) -> index 1,2,3 -> Two, Three, Four. Take(3) -> Two, Three, Four. // Để lấy 3 phần tử cuối: Skip(Count - 3) = Skip(1) -> Two, Three, Four.
Lưu ý hiệu suất
Reverse()tạo một iterator mới, không sửa đổi list gốc.- Với List lớn,
Skip(Count - n)hiệu quả hơn vì không cần đảo ngược toàn bộ. - Cả hai đều là deferred execution.