C# Series 4- Một ví dụ cụ thể về ứng dụng lambda expression trong Linq

Linq Series 4- Một ví dụ cụ thể về ứng dụng lambda expression trong Linq

Chia sẻ kiến thức 15/04/2023

Ví dụ cụ thể về ứng dụng lambda expression trong Linq

Xin chào các bạn, trong bài trước mình đã giới thiệu về khái niệm lambda expression trong linq . Trong bài này mình sẽ nêu ra ví dụ cụ thể về khả năng sử dụng lambda expression trong linq . 

Phần 1: Xây dựng 2 phương thức kiểm tra dãy số nguyên

Xây dựng 2 phương thức như sau:

-Phương thức IsAnyLargerThan100_c1() nhận tham số là một mảng số nguyên và trả về kiểu boolean. Phương thức này dùng để kiểm tra xem trong danh sách số nguyên có tồn tại 1 số bất kỳ  lớn hơn 100 không.

-Phương thức IsAnyEven_c1() nhận tham số là một mảng số nguyên và trả về kiểu boolean. Phương thức này dùng để kiểm tra xem trong danh sách số nguyên có tồn tại một số bất kỳ là chẵn hay không

-Phương thức test_1() dùng để kiểm tra 2 phương thức trên với dãy số  1, 4, 3, 99, 256, 2

        private static bool IsAnyLargerThan100_c1(int[] numbers)
        {
            foreach (var number in numbers)
            {
                if (number > 100)
                {
                    return true;
                }
            }
            return false;
        }
        //2
        private static bool IsAnyEven_c1(int[] numbers)
        {
            foreach (var number in numbers)
            {
                if (number %2 == 0)
                {
                    return true;
                }
            }
            return false;
        }
        private static void test_1()
        {
            var numbers = new[] { 1, 4, 3, 99, 256, 2 };
            bool isAnyLargerThan100=IsAnyLargerThan100_c1(numbers);
            Console.WriteLine($"Is Any > 100?: {isAnyLargerThan100}");
            bool isAnyEven = IsAnyEven_c1(numbers);
            Console.WriteLine($"Is Any Even?: {isAnyEven}");
        }

Kết quả:

Phần 2 : Viết 2 phương thức kiểm tra điều kiện với số nguyên

Chúng ta đã có 2 phương thức dùng để kiểm tra với dãy số, bây giờ hãy tách phần điều kiện kiểm tra ra phương thức riêng và viết lại :

– Phương thức IsLargeThan100() với tham số là một số nguyên và trả về kiểu boolean . Phương thức này dùng để kiểm tra 1 số có lớn hơn 100 hay không.

-Phương thức IsEven() với tham số là một số nguyên và trả về kiểu boolean. Phương thức này dùng để kiểm tra 1 số có phải là số chẵn hay không.

Thực hành :

      //3
        private static bool IsLargeThan100(int number)
        {
            return number > 100;
        }
        //4
        private static bool IsEven(int number)
        {
            return number %2 == 0;
        }

Viết lại 2 hàm phần 1:

//5
private static bool IsAnyLargerThan100_c2(int[] numbers)
{
foreach (var number in numbers)
{
if (IsLargeThan100(number))
{
return true;
}
}
return false;
}
//6
private static bool IsAnyEven_c2(int[] numbers)
{
foreach (var number in numbers)
{
if (IsEven(number))
{
return true;
}
}
return false;
}

Phần 3 : Sử dụng Delegate để thay thế

Với phần 2, chúng ta đã tách điều kiện ra phương thức riêng và sử dụng chúng vào hàm rộng hơn để kiểm tra.Bây giờ chúng ta sẽ chuyển qua phương thức kiểm tra dãy số bằng điều kiện bất kỳ với cách dùng phương thức như một tham sốnhư delegate.

Khái niệm về Delegate trong c# như sau:

Trong C#, Delegate là một kiểu dữ liệu tham chiếu đại diện cho một hoặc nhiều phương thức có cùng chữ ký (kiểu trả về và danh sách tham số giống nhau). Nó cho phép bạn truyền phương thức như một tham số cho một phương thức khác hoặc lưu trữ phương thức trong một biến để sử dụng sau.

Tiếp tục ,ta thực hiện việc sau:

 -Xây dựng phương thức IsAny(int[] numbers, Func<int, bool> predicate) với 2 tham số là :

  • numbers là một mảng số nguyên (int[]).
  • predicate là một đối tượng của lớp Func<int, bool>. Func<int, bool> là một kiểu delegate trong .NET Framework, nó có nhiệm vụ là chuyển đổi một số nguyên thành một giá trị boolean. Điều này có nghĩa là predicate là một hàm số (hàm đối số) có thể được sử dụng để xác định một số nguyên có thoả điều kiện nào đó hay không.

-Kiểu trả về của phương thức IsAny() là boolean, phương thức này sẽ kiểm tra xem trong danh sách số nguyên có bất kỳ số nào thỏa mãn điều kiện của phương thức được truyền vào hay không.

-Viết phương thức test_2() để dùng phương thức trên với 2 kiểu delegate là IsLargeThan100() và IsEven() đối với dãy số  1, 4, 3, 99, 256, 2
Thực hành:

        //7
        private static bool IsAny(int[] numbers, Func<int, bool> predicate)
        {
            foreach (var number in numbers)
            {
                if (predicate(number))
                {
                    return true;
                }
            }
            return false;
        }
     private static void test_2()
        {
            var numbers = new[] { 1, 4, 3, 99, 256, 2 };
            bool isAnyLargerThan100 = IsAny(numbers, IsLargeThan100);
            Console.WriteLine($"Is Any > 100?: {isAnyLargerThan100}");
            bool isAnyEven = IsAny(numbers, IsEven);
            Console.WriteLine($"Is Any Even?: {isAnyEven}");
        }

Kết quả:

Phần 4: Sử dụng Lambda expression để thay thế

Với bước 3 , ta đã có một phương thức kiểm tra một dãy số nguyên với điều kiện bất kỳ được truyền vào. Trong trường hợp có nhiều phương thức điều kiện để sử dụng và chỉ sử dụng một  lần hoặc một vài lần thì chúng ta có thể sử dụng biểu thức lambda để thay thế cho phương thức cụ thể.

Khái niệm về biểu thức lambda như sau :

Lambda expression là một cú pháp rút gọn của việc định nghĩa một phương thức hay hàm trong lập trình. Thay vì phải viết một đoạn mã dài dòng để xác định cách thức hoạt động của phương thức, chúng ta có thể sử dụng lambda expression để định nghĩa phương thức một cách đơn giản và ngắn gọn hơn. 

Thực hiện : 

-Viết phương thức test_3() Thay thế các điều kiện sử dụng trong phương thức test_2() ở phần 3 bằng biểu thức lambda

Thực hành:

      private static void test_3()
        {
            Console.WriteLine("Using test 3...");
            var numbers = new[] { 1, 4, 3, 99, 256, 2 };
            bool isAnyLargerThan100 = IsAny(numbers, number => number > 100);
            Console.WriteLine($"Is Any > 100?: {isAnyLargerThan100}");
            bool isAnyEven = IsAny(numbers, number => number % 2 == 0);
            Console.WriteLine($"Is Any Even?: {isAnyEven}");
        }

Kết quả : 

So sánh 2 phương thức IsAny() và phương thức Any() của Linq

Phương thức tự viết IsAny():

Phương thức của linq Any()

Như vậy 2 phương thức trên tương đối giống nhau. Ở phương thức Any() của Linq sử dụng Generic TSource thay cho int,IEnumerable<TSource> thay cho int[]. Và đồng thời thêm 2 điều kiện if để check tham số.

Tài liệu tham khảo

Link Github : https://github.com/vupt172/linq-series/tree/linq-series-4

Học viên Phạm Tuấn Vũ

 

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
FUNiX V2 GenAI Chatbot ×

yêu cầu gọi lại