Thao tác dữ liệu phần 1

5 92 0
Thao tác dữ liệu phần 1

Đang tải... (xem toàn văn)

Thông tin tài liệu

Chương : Thao tác Dữ liệu Hầu hết ứng dụng cần thao tác loại liệu Microsoft NET Framework cung cấp nhiều kỹ thuật để đơn giản hóa hay nâng cao hiệu thao tác liệu thông dụng Chương đề cập kỹ thuật sau: „ Thao tác chuỗi cách hiệu (mục 2.1) „ Mô tả kiểu liệu sở kiểu mã hóa khác (mục 2.2, 2.3, 2.4) „ Sử dụng biểu thức quy để xác nhận tính hợp lệ thao tác chuỗi (mục 2.5 2.6) „ Làm việc với ngày (mục 2.7 2.8) „ Làm việc với mảng tập hợp (mục 2.9, 2.10, 2.11) „ Tuần tự hóa trạng thái đối tượng lưu vào file (mục 2.12) 1.1 Thao tác chuỗi cách hiệu V Bạn cần thao tác nội dung đối tượng String tránh chi phí # việc tự động tạo đối tượng String tính không đổi đối tượng String Sử dụng lớp System.Text.StringBuilder để thực thao tác, sau chuyển kết thành String phương thức StringBuilder.ToString Các đối tượng String NET không đổi, nghĩa tạo chúng bị thay đổi Ví dụ, bạn tạo String cách nối số ký tự chuỗi, thêm phần tử vào cuối String có, thực thi tạo String chứa kết (chứ String cũ bị thay đổi) Do nảy sinh chi phí đáng kể ứng dụng bạn thường xuyên thao tác String Lớp StringBuilder khắc phục vấn đề cách cung cấp đệm ký tự, cho phép thao tác nội dung mà thực thi tạo đối tượng để chứa kết sau lần thay đổi Bạn tạo đối tượng StringBuilder rỗng khởi tạo nội dung String có Sau đó, thao tác nội dung StringBuilder phương thức nạp chồng (cho phép bạn chèn, thêm dạng chuỗi kiểu liệu khác nhau) Cuối cùng, gọi StringBuilder.ToString để chuyển nội dung StringBuilder thành String Khi bạn thêm liệu vào chuỗi, có hai thuộc tính quan trọng ảnh hưởng đến hoạt động StringBuilder Capacity Length Capacity mô tả kích thước đệm StringBuilder, Length mô tả kích thước chuỗi ký tự đệm Nếu việc thêm liệu vào StringBuilder làm kích thước chuỗi (Length) vượt kích thước đệm (Capacity) StringBuilder cấp phát đệm để chứa chuỗi Nếu thiếu cẩn thận, việc cấp phát đệm phủ định lợi ích việc sử dụng StringBuilder Do đó, biết xác kích thước chuỗi, biết kích thước tối đa chuỗi, bạn tránh việc cấp phát đệm mức cần thiết cách thiết lập thuộc tính Capacity định kích thước đệm lúc tạo StringBuilder Khi thiết lập thuộc tính Capacity Length, cần ý điểm sau: • Nếu bạn thiết lập giá trị Capacity nhỏ giá trị Length, thuộc tính Capacity ném ngoại lệ System.ArgumentOutOfRangeException • Nếu bạn thiết lập giá trị Length nhỏ kích thước chuỗi có đệm, chuỗi bị cắt bớt phần lớn • Nếu bạn thiết lập giá trị Length lớn kích thước chuỗi, đệm "lấp" thêm khoảng trắng cho với Length Việc thiết lập giá trị Length lớn giá trị Capacity tự động điều chỉnh Capacity cho với Length Phương thức ReverseString minh họa cách sử dụng lớp StringBuilder để đảo chuỗi Nếu không sử dụng lớp StringBuilder để thực thao tác tốn chi phí đáng kể, đặc biệt chuỗi nguồn dài Việc khởi tạo StringBuilder với kích thước chuỗi nguồn bảo đảm không cần phải cấp phát lại đệm trình đảo chuỗi public static string ReverseString(string str) { // Kiểm tra trường hợp không cần đảo chuỗi if (str == null || str.Length == 1) { return str; } // Tạo StringBuilder với sức chứa cần thiết System.Text.StringBuilder revStr = new System.Text.StringBuilder(str.Length); // Duyệt ngược chuỗi nguồn ký tự // thêm ký tự đọc vào StringBuilder for (int count = str.Length-1; count > -1; count ) { revStr.Append(str[count]); } // Trả chuỗi đảo return revStr.ToString(); } 1.2 Mã hóa chuỗi kiểu mã hóa ký tự V Bạn cần trao đổi liệu dạng ký tự với hệ thống sử dụng kiểu mã hóa khác # với UTF-16 (kiểu mã hóa sử dụng CRL) Sử dụng lớp System.Text.Encoding lớp để chuyển đổi ký tự kiểu mã hóa khác Unicode kiểu mã hóa nhất, UTF-16 cách biểu diễn ký tự Unicode Khi ứng dụng cần trao đổi liệu ký tự với hệ thống bên (đặc biệt hệ thống cũ), liệu cần phải chuyển đổi UTF-16 kiểu mã hóa mà hệ thống hỗ trợ Lớp trừu tượng Encoding, lớp cung cấp chức để chuyển ký tự qua lại nhiều kiểu mã hóa khác Mỗi thể lớp hỗ trợ việc chuyển đổi UTF-16 kiểu mã hóa khác Phương thức tĩnh Encoding.GetEncoding nhận vào tên số hiệu trang mã (code page number) kiểu mã hóa trả thể lớp mã hóa tương ứng Bảng 2.1 liệt kê vài kiểu mã ký tự số hiệu trang mã mà bạn phải truyền cho phương thức GetEncoding để tạo thể lớp mã hóa tương ứng Bảng cung cấp thuộc tính tĩnh lớp Encoding đại diện cho phương thức GetEncoding tương ứng Bảng 2.1 Các lớp mã hóa ký tự Kiểu mã hóa Lớp Sử dụng ASCII ASCIIEncoding GetEncoding(20127) hay thuộc tính ASCII Mặc định (kiểu mã hóa hành hệ thống) Encoding GetEncoding(0) hay thuộc tính Default UTF-7 UTF7Encoding GetEncoding(65000) hay thuộc tính UTF7 UTF-8 UTF8Encoding GetEncoding(65001) hay thuộc tính UTF8 UTF-16 (Big Endian) UnicodeEncoding GetEncoding(1201) hay thuộc tính BigEndianUnicode UTF-16 (Little Endian) UnicodeEncoding Windows OS Encoding GetEncoding(1200) hay thuộc tính Unicode GetEncoding(1252) Sau lấy đối tượng lớp Encoding hỗ trợ kiểu mã hóa thích hợp, sử dụng phương thức GetBytes để chuyển chuỗi nguồn (được mã hóa theo UTF-16) thành mảng kiểu byte chứa ký tự mã hóa theo kiểu cần chuyển, sử dụng GetString để chuyển mảng byte thành chuỗi đích Ví dụ trình bày cách sử dụng vài lớp mã hóa: using System; using System.IO; using System.Text; public class CharacterEncodingExample { public static void Main() { // Tạo file giữ kết using (StreamWriter output = new StreamWriter("output.txt")) { // Tạo ghi file chuỗi chứa ký hiệu số PI string srcString = "Area = \u03A0r^2"; output.WriteLine("Source Text : " + srcString); // Ghi byte mã hóa theo UTF-16 // chuỗi nguồn file byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF-16 Bytes: {0}", BitConverter.ToString(utf16String)); // Chuyển chuỗi nguồn mã hóa theo UTF-16 // thành UTF-8 ASCII byte[] utf8String = Encoding.UTF8.GetBytes(srcString); byte[] asciiString = Encoding.ASCII.GetBytes(srcString); // Ghi mảng byte mã hóa theo UTF-8 ASCII file output.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String)); output.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString)); // Chuyển byte mã hóa theo UTF-8 ASCII // thành chuỗi mã hóa theo UTF-16 ghi file output.WriteLine("UTF-8 Text : {0}", Encoding.UTF8.GetString(utf8String)); output.WriteLine("ASCII Text : {0}", Encoding.ASCII.GetString(asciiString)); // Ghi liệu xuống file đóng file output.Flush(); output.Close(); } } } ... GetEncoding(650 01) hay thuộc tính UTF8 UTF -16 (Big Endian) UnicodeEncoding GetEncoding (12 01) hay thuộc tính BigEndianUnicode UTF -16 (Little Endian) UnicodeEncoding Windows OS Encoding GetEncoding (12 00)... count = str.Length -1; count > -1; count ) { revStr.Append(str[count]); } // Trả chuỗi đảo return revStr.ToString(); } 1. 2 Mã hóa chuỗi kiểu mã hóa ký tự V Bạn cần trao đổi liệu dạng ký tự với... Ghi byte mã hóa theo UTF -16 // chuỗi nguồn file byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF -16 Bytes: {0}", BitConverter.ToString(utf16String)); // Chuyển chuỗi

Ngày đăng: 04/12/2015, 23:41

Tài liệu cùng người dùng

Tài liệu liên quan