1. Mở đầu

Trong bài viết này, mình sẽ là đưa ra cách để tạo một chuỗi ngẫu nhiên trong ngôn ngữ C#. Từ vấn đề đó, mình sẽ tiếp tục hướng dẫn cách để thêm phương thức tạo chuỗi ngẫu nhiên vào lớp Random hiện có.

2. Xây dựng chương trình

Để đơn giản hóa vấn đề, cũng như giúp cho mình dễ dàng hơn trong việc truyền đạt, mình sẽ thực hiện một chương trình nhỏ dưới dạng C# – ConsoleApp trong Visual Studio 2019.

a) Tạo một project C# – Console App

Tạo một Console App trong Visual Studio 2019.

b) Tạo một lớp (class) mới với tên RandomExtensions

Tạo một class mới với tên RandomExtensions.

Lớp (class) được tạo với tên RandomExtensions sẽ nằm trong tập tin RandomExtensions.cs

Sau khi tạo xong lớp (class) RandomExtensions, bạn thay đổi code giống như đoạn code mình cung cấp ở bên dưới.

using System.Linq;

namespace System
{
    public static class RandomExtension
    {
        public static string NextString(this Random random, int length)
        {
            const string chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray());
        }
    }
}

Giải thích cách tạo ra chuỗi ngẫu nhiên:

– Mình tạo ra một hằng số kiểu chuỗi tập hợp các ký tự A đến Z, a đến z, 0 đến 9. Bạn hoàn toàn có thể bổ sung thêm các ký tự khác.

const string chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";

– Từ biến độ dài chuỗi được truyền vào (int length), Enumerable.Repeat(chars, length) sẽ tạo ra 1 danh sách chứa các chuỗi giống nhau với số lượng phần tử bằng với tham số int length. Giá trị của các phần tử trong danh sách giống với hằng số mà mình đã tạo.

– Từ danh sách đã có, phương thức Select(s => s[random.Next(s.Length)]).ToArray() sẽ duyệt qua các phần tử trong danh sách chuỗi được tạo ra từ Enumerable.Repeat(chars, length). Khi duyệt qua từng phần từ (chuỗi), phương thức Select(s => s[random.Next(s.Length)]).ToArray() sẽ thực hiện lấy ra ký tự theo chỉ số (index) của các phần tử, các chỉ số sẽ được lấy ngẫu nhiên nằm trong khoảng 0 <= x < (int length). Cứ như vậy, sau khi duyệt xong danh chuỗi từ được tạo ra từ Enumerable.Repeat(chars, length) thì cũng tạo xong một mảng ký tự ngẫu nhiên với độ dài bằng int length.

– Từ mảng ký tự, bây giờ mình chỉ cần chuyển thành chuỗi nữa là xong.

** Đơn giản hóa code:

Mình đã viết lại code bên trên theo hướng đơn giản hóa, tường minh hơn.

using System.Collections.Generic;
using System.Linq;

namespace System
{
    public static class RandomExtension
    {
        public static string NextString(this Random random, int length)
        {
            const string chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";

            IEnumerable<string> string_Enumerable = Enumerable.Repeat(chars, length);
            char[] arr = string_Enumerable.Select(s => s[random.Next(s.Length)]).ToArray();
          
            return new string(arr);
        }
    }
}

c) Viết code gọi phương thức trong Program.cs

Tại tập tin Program.cs, bạn thực hiện viết code như sau:

using System;
using System.Text;

namespace RandomString
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;
            Console.WriteLine("Tạo chuỗi ngẫu nhiên: ");

            Random random = new Random();
            for(int i = 0; i < 10; i++)
            {
                string s = random.NextString(40);
                Console.WriteLine($"Chuỗi {i + 1}: {s}");
            }

            Console.ReadKey();
        }
    }
}

d) Chạy chương trình

Kết quả khi chạy chương trình tạo chuỗi ngẫu nhiên.

3. Tìm hiểu về phương thức mở rộng (extension methods)

Bây giờ hãy cùng mình nhìn lại đoạn code này nhé!

using System.Linq;

namespace System
{
    public static class RandomExtension
    {
        public static string NextString(this Random random, int length)
        {
            const string chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
            return new string(Enumerable.Repeat(chars, length)
              .Select(s => s[random.Next(s.Length)]).ToArray());
        }
    }
}

Bạn có phát hiện điều đặc biệt gì không nào? Bạn có tự đặt câu hỏi rằng tại sao phương thức tĩnh (static method) nhưng lại gọi thông qua đối tượng của lớp, mà không phải gọi thông qua tên lớp không?

Để trả lời cho câu hỏi trên mình sẽ đề cập đến khái niệm “phương thức mở rộng (extension methods)”. Phương thức mở rộng là các phương thức được bổ sung vào các lớp có sẵn mà không cần phải tạo kế thừa lớp để tạo ra các lớp mới, không cần biên dịch lại thư viện.

Để hiểu rõ hơn về phương thức mở rộng, bạn có thể đọc tại đây: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods.

Giải thích code:

– Mình thực hiện viết một phương thức mở rộng cho lớp Random, cụ thể ở đây là phương thức tạo chuỗi ngẫu nhiên có tên là NextString(this Random random, int length). Từ khóa this trong trường hợp này là để chỉ rằng đây là phương thức mở rộng cho lớp (class) Random.

– Về không gian tên (namespace):

  • Nếu đặt tên là System: Khi sử dụng lớp Random và cả phương thức mở rộng được viết thêm thì chỉ cần khai báo không gian tên System là được.
  • Nếu đặt tên khác:
    • Nếu chỉ khai báo không tên System: Chỉ sử dụng được lớp Random với các phương thức có sẵn.
    • Để sử dụng các phương thức mở rộng đã được viết thêm, bạn phải khai báo thêm không gian tên chứa phương thức mở rộng đó.

Đơn giản phải không nào?

– Để sử dụng phương thức mở rộng tạo chuỗi ngẫu nhiên, mình khởi tạo một đối tượng Random và từ đối tượng đã được khởi tạo gọi đến phương thức mở rộng chuỗi ngẫu nhiên.

Như hình trên, bạn sẽ thấy Visual Studio 2019 đã hiển thị gợi ý và có chú thích rằng đây là phương thức mở rộng.

Khi đọc đến đây chắc bạn cũng đã hiểu được phần nào về phương thức mở rộng rồi phải không nào? Nếu các bạn cần tìm hiểu thêm, thì có thể truy cập vào link mà mình đã đưa bên trên hoặc cũng có thể tìm kiếm trên Google.

5. Lời kết

Bài viết này đã đưa ra cho bạn cách để giải quyết vấn đề tạo ra một chuỗi ngẫu nhiên trong C#. Bên cạnh đó, mình cũng đã truyền đạt những hiểu biết của mình về phương thức mở rộng (extension methods) và áp dụng nó vào vấn đề tạo chuỗi ngẫu nhiên.

Mình sẽ luôn sẵn sàng giải đáp những câu hỏi, vì thế đừng ngần ngại đưa ra bình luận, ý kiến của bạn. Cuối cùng, cảm ơn bạn đã đọc bài viết, nếu bạn thấy hay thì hãy chia sẻ bài viết đến với nhiều người hơn nhé! Mình sẽ rất vui vì điều đó!

Được phân loại:

Được gắn thẻ: