Toán tử phân vùng trong LINQ

Toán tử phân vùng chia danh sách thành hai phần và trả về một trong hai phần đó.

Dưới đây là những toán tử phân vùng có sẵn trong LINQ:

Phương thức Mô tả
Skip Bỏ qua các phần tử đến một vị trí được chỉ định bắt đầu từ phần tử đầu tiên trong danh sách và trả về phần còn lại của danh sách.
SkipWhile Bỏ qua các phần tử dựa trên một điều kiện cho đến khi một phần tử không thỏa mãn điều kiện và trả về phần còn lại của danh sách. Nếu chính phần tử đầu tiên không thỏa mãn điều kiện, thì nó không bỏ qua phần tử nào và trả về tất cả các phần tử trong danh sách.
Take Trả về các phần tử đến một vị trí được chỉ định bắt đầu từ phần tử đầu tiên trong danh sách.
TakeWhile Trả về các phần tử từ phần tử đầu tiên cho đến khi một phần tử không thỏa mãn điều kiện. Nếu chính phần tử đầu tiên không thỏa mãn điều kiện thì trả về một danh sách trống.

Toán tử phân vùng là một trong những toán tử truy vấn chuẩn của LINQ.

Toán tử truy vấn chuẩn của LINQ | Comdy
Các toán tử truy vấn chuẩn trong LINQ là các phương thức mở rộng cho các kiểu IEnumerable<T> và IQueryable<T>.

Phương thức Skip trong LINQ

Phương thức mở rộng Skip bỏ qua các phần tử đến một vị trí được chỉ định bắt đầu từ phần tử đầu tiên trong danh sách và trả về phần còn lại của danh sách.

Trong ví dụ sau, phương thức Skip bỏ qua các phần tử đầu tiên và trả về các phần tử từ vị trí thứ 2 trở đi. Lưu ý chỉ mục bắt đầu tứ số 0:


IList<string> strList = new List<string>(){ "One", "Two", "Three", "Four", "Five" };

var newList = strList.Skip(2);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

Three
Four
Five
Lưu ý: Toán tử Skip không hỗ trợ  cú pháp truy vấn trong LINQ.

Phương thức SkipWhile trong LINQ

Như tên gọi, phương thức mở rộng SkipWhile trong LINQ bỏ qua các phần tử trong danh sách nếu điều kiện được chỉ định là true.

Nó trả về một danh sách mới bao gồm tất cả các phần tử còn lại sau khi điều kiện được chỉ định trở thành false cho bất kỳ phần tử nào.

Phương thức SkipWhile có hai phương thức quá tải. Phương thức quả tải đầu tiên chấp nhận kiểu delegate Func<TSource, bool> và phương thức quá tải thứ hai chấp nhận kiểu delegate Func<TSource, int, bool> để truyền chỉ mục của một phần tử.

Trong ví dụ sau, phương thức SkipWhile bỏ qua các phần tử cho đến khi nó tìm thấy một chuỗi có độ dài lớn hơn hoặc bằng 4 ký tự.


IList<string> strList = new List<string>(){ "One", "Two", "Three", "Four", "Five" };

var newList = strList.SkipWhile(s => s.Length < 4);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

Three
Four
Five
Six

Trong ví dụ trên, phương thức SkipWhile bỏ qua hai phần tử đầu tiên vì độ dài của chúng nhỏ hơn 4 và tìm thấy phần tử thứ ba có độ dài bằng 4.

Một khi nó tìm thấy bất kỳ phần tử nào có độ dài lớn hơn hoặc bằng 4 ký tự thì nó sẽ không bỏ qua bất kỳ phần tử nào khác ngay cả khi chúng có ít hơn 4 ký tự.

Bây giờ, hãy xem ví dụ sau trong đó phương thức SkipWhile không bỏ qua bất kỳ phần tử nào vì điều kiện được chỉ định là sai cho phần tử đầu tiên.


IList<string> strList = new List<string>(){ "Three", "One", "Two", "Four", "Five" };

var newList = strList.SkipWhile(s => s.Length < 4);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

Three
One
Two
Four
Five
Six

Phương thức quá tải thứ hai của SkipWhile truyền vào một chỉ mục của từng phần tử. Hãy xem ví dụ sau:


IList<string> strList = new List<string>(){ "One", "Two", "Three", "Four", "Five", "Six" };

var newList = strList.SkipWhile((s, i) => s.Length > i);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

Five
Six

Trong ví dụ trên, biểu thức lambda bao gồm phần tử và chỉ mục của một phần tử làm tham số. Nó bỏ qua tất cả các phần tử nếu độ dài của phần tử chuỗi lớn hơn chỉ mục của nó.

Lưu ý: Toán tử SkipWhile không hỗ trợ  cú pháp truy vấn trong LINQ.

Phương thức Take trong LINQ

Phương thức mở rộng Take trả về các phần tử đến một vị trí được chỉ định bắt đầu từ phần tử đầu tiên trong danh sách.

Trong ví dụ sau, phương thức Take trả về các phần tử từ đầu đến trước phần tử có vị trí thứ 2. Lưu ý chỉ mục bắt đầu tứ số 0:


IList<string> strList = new List<string>(){ "One", "Two", "Three", "Four", "Five" };

var newList = strList.Take(2);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

One
Two
Lưu ý: Toán tử Take không hỗ trợ  cú pháp truy vấn trong LINQ.

Phương thức TakeWhile trong LINQ

Phương thức mở rộng TakeWhile trong LINQ trả về các phần tử từ phần tử đầu tiên cho đến khi một phần tử không thỏa mãn điều kiện. Nếu chính phần tử đầu tiên không thỏa mãn điều kiện thì trả về một danh sách trống.

Phương thức TakeWhile có hai phương thức quá tải. Phương thức quả tải đầu tiên chấp nhận kiểu delegate Func<TSource, bool> và phương thức quá tải thứ hai chấp nhận kiểu delegate Func<TSource, int, bool> để truyền chỉ mục của một phần tử.

Trong ví dụ sau, phương thức TakeWhile trả về một danh sách mới gồm các phần tử từ đầu cho đến khi nó tìm thấy một phần tử có chiều dài nhỏ hơn 4 ký tự.


IList<string> strList = new List<string>(){ "Three", "Four", "Five", "Hundred" };

var newList = strList.TakeWhile(s => s.Length > 4);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

Three

Trong ví dụ trên, phương thức TakeWhile chỉ trả về phần tử thứ nhất vì phần tử thứ hai không thỏa mãn điều kiện.

Phương thức quá tải thứ hai của TakeWhile truyền vào một chỉ mục của từng phần tử. Ví dụ sau về phương thức TakeWhile lấy các phần tử cho đến khi độ dài của phần tử lớn hơn chỉ mục của nó:


IList<string> strList = new List<string>() { "One", "Two", "Three", "Four", "Five", "Six" };

var newList = strList.TakeWhile((s, i) => s.Length > i);
foreach(var str in newList)
{
    Console.WriteLine(str);
}
    

Đây là kết quả khi biên dịch và thực thi chương trình:

One
Two
Three
Four

Trong ví dụ trên, biểu thức lambda bao gồm phần tử và chỉ mục của một phần tử làm tham số. Nó lấy các phần tử cho đến khi độ dài của phần tử lớn hơn chỉ mục của nó.

Lưu ý: Toán tử TakeWhile không hỗ trợ  cú pháp truy vấn trong LINQ.
LINQ
Bài Viết Liên Quan:
Truy vấn LINQ phức tạp
Trung Nguyen 23/04/2020
Truy vấn LINQ phức tạp

Bạn sẽ tìm hiểu một số truy vấn LINQ phức tạp trong hướng dẫn này.

Từ khóa let, into trong LINQ
Trung Nguyen 23/04/2020
Từ khóa let, into trong LINQ

Từ khóa let, into trong LINQ có tác dụng gì? Hướng dẫn khai báo và sử dụng từ khóa let, into trong LINQ.

Thực thi truy vấn LINQ
Trung Nguyen 23/04/2020
Thực thi truy vấn LINQ

Trì hoãn thực thi truy vấn LINQ là gì? Thực thi ngay lập tức truy vấn LINQ là gì? Làm sao để thực thi truy vấn LINQ.

Expression trong LINQ
Trung Nguyen 23/04/2020
Expression trong LINQ

Expression trong LINQ là gì? Cây biểu thức trong LINQ là gì? Cách khai báo và sử dụng chúng trong LINQ.