Giáo trình hình thành quy trình ứng dụng cấu tạo bo mạch mảng một chiều trong dấu ngoặc p3

10 9 0
Giáo trình hình thành quy trình ứng dụng cấu tạo bo mạch mảng một chiều trong dấu ngoặc p3

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

Thông tin tài liệu

. Ngôn Ngữ Lập Trình C# IDictionary IDictionaryEnumerator Dùng trong các tập hợp dựa trên khóa và giá trị như Hashtable và SortedList. Cho phép liệt kê dùng câu lệnh foreach qua tập hợp hỗ trợ IDictionary. Bảng 9.2: Giao diện cho tập hợp. Giao diện IEnumerable Chúng ta có thể hỗ trợ cú pháp foreach trong lớp ListBoxTest bằng việc thực thi giao diện IEnumerator. Giao diện này chỉ có một phương thức duy nhất là GetEnumerator(), công việc của phương thức là trả về một sự thực thi đặc biệt của IEnumerator. Do vậy, ngữ nghĩa của lớp Enumerable là nó có thể...

Ngơn Ngữ Lập Trình C# IDictionary IDictionaryEnumerator Dùng tập hợp dựa khóa giá trị Hashtable SortedList Cho phép liệt kê dùng câu lệnh foreach qua tập hợp hỗ trợ IDictionary Bảng 9.2: Giao diện cho tập hợp Giao diện IEnumerable Chúng ta hỗ trợ cú pháp foreach lớp ListBoxTest việc thực thi giao diện IEnumerator Giao diện có phương thức GetEnumerator(), cơng việc phương thức trả thực thi đặc biệt IEnumerator Do vậy, ngữ nghĩa lớp Enumerable cung cấp Enumerator: public IEnumerator GetEnumerator() { return (IEnumerator) new ListBoxEnumerator(this); } phải thực thi phương thức thuộc tính IEnumerator Chúng thực thi trực tiếp lớp chứa (trong trường hợp lớp ListBoxTest) hay lớp phân biệt khác Cách tiếp cận thứ hai thường sử dụng nhiều hơn, chúng đóng gói lớp Enumerator việc phân vào lớp chứa Do lớp Enumerator xác định cho lớp chứa, theo lớp ListBoxEnumerator phải biết nhiều lớp ListBoxTest Nên phải tạo cho thực thi riêng chứa bên lớp ListBoxTest Lưu ý phương thức GetEnumerator truyền đối tượng ListBoxTest thời (this) cho enumerator Điều cho phép enumerator liệt kê thành phần tập hợp đối tượng ListBoxTest Ở lớp thực thi Enumerator ListBoxEnumerator, lớp private định nghĩa bên lớp ListBoxTest Lớp thực thi đơn giản bao gồm thuộc tính public, hai phương thức public MoveNext(), Reset() Đối tượng ListBoxTest truyền vào đối mục khởi tạo Ở gán cho biến thành viên myLBT Trong hàm khởi tạo thực thiết lập giá trị biến thành viên index -1, chưa bắt đầu thực việc enumerator đối tượng: Enumerator public ListBoxEnumerator(ListBoxTest lbt) { this.lbt = lbt; index = -1; } Phương thức MoveNext() gia tăng index sau kiểm tra để đảm bảo việc thực không vượt số phần tử tập hợp đối tượng: public bool MoveNext() 243 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C# { index++; if (index >= lbt.strings.Length) return false; else return true; } Phương thức IEnumerator.Reset() khơng làm thiết lập lại giá trị index -1 Thuộc tính Current trả đối tượng chuỗi hành Đó tất việc cần làm cho lớp ListBoxTest thực thi giao diện IEnumerator Câu lệnh foreach gọi để đem enumerator, sử dụng để liệt kê qua thành phần mảng Sau tồn chương trình minh họa cho việc thực thi  Ví dụ 9.11: Tạo lớp ListBox hỗ trợ enumerator namespace Programming_CSharp { using System; using System.Collections; // tạo control đơn giản public class ListBoxTest: IEnumerable { // lớp thực thi riêng ListBoxEnumerator private class ListBoxEnumerator : IEnumerator { public ListBoxEnumerator(ListBoxTest lbt) { this.lbt = lbt; index = -1; } // gia tăng index đảm bảo giá trị hợp lệ public bool MoveNext() { index++; if (index >= lbt.strings.Length) return false; else return true; } 244 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C# public void Reset() { index = -1; } public object Current { get { return( lbt[index]); } } private ListBoxTest lbt; private int index; } // trả Enumerator public IEnumerator GetEnumerator() { return (IEnumerator) new ListBoxEnumerator(this); } // khởi tạo listbox với chuỗi public ListBoxTest (params string[] initStr) { strings = new String[10]; // copy từ mảng chuỗi tham số foreach (string s in initStr) { strings[ctr++] = s; } } public void Add(string theString) { strings[ctr] = theString; ctr++; } // cho phép truy cập giống mảng public string this[int index] { get 245 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C# { if ( index < || index >= strings.Length) { // xử lý index sai } return strings[index]; } set { strings[index] = value; } } // số chuỗi nắm giữ public int GetNumEntries() { return ctr; } private string[] strings; private int ctr = 0; } public class Tester { static void Main() { ListBoxTest lbt = new ListBoxTest(“Hello”, “World”); lbt.Add(“What”); lbt.Add(“Is”); lbt.Add(“The”); lbt.Add(“C”); lbt.Add(“Sharp”); string subst = “Universe”; lbt[1] = subst; // truy cập tất chuỗi int count =1; foreach (string s in lbt) { Console.WriteLine(“Value {0}: {1}”,count, s); count++; 246 Mảng, Chỉ Mục, Tập Hợp Ngôn Ngữ Lập Trình C# } } } }  Kết quả: Value 1: Hello Value 2: Universe Value 3: What Value 4: Is Value 5: The Value 6: C Value 7: Sharp Value 8: Value 9: Value 10: Chương trình thực cách tạo đối tượng ListBoxTest truyền hai chuỗi vào cho khởi dựng Khi đối tượng tạo mảng chuỗi định nghĩa có kích thước 10 chuỗi Năm chuỗi sau đưa vào phương thức Add() Và chuỗi thứ hai sau cập nhật lại giá trị Sự thay đổi lớn chương trình phiên câu lệnh foreach gọi để truy cập chuỗi ListBox Vòng lặp foreach tự động sử dụng giao diện IEnumerator cách gọi phương thức GetEnumerator() Một đối tượng ListBoxEnumerator tạo giá trị index = -1 thiết lập khởi tạo Vòng lặp foreach sau gọi phương thức MoveNext(), index gia tăng đến trả true Khi foreach sử dụng thuộc tính Current để nhận lại chuỗi hành Thuộc tính Current gọi mục ListBox nhận lại chuỗi lưu trữ vị trí Chuỗi gán cho biến s định nghĩa vòng lặp, chuỗi hiển thị hình console Vịng lặp tiếp tục thực từngt bước: MoveNext(), Current(), hiển thị chuỗi tất chuỗi list box hiển thị Trong minh họa khai báo mảng chuỗi có 10 phần tử, nên kết ta thấy chuỗi vị trí 8, 9, 10 khơng có nội dung Giao diện ICollection Một giao diện quan trọng khác cho mảng cho tất tập hợp cung cấp NET Framework ICollection ICollection cung cấp bốn thuộc tính: Count, IsReadOnly, IsSynchronized, SyncRoot Ngoài ICollection cung cấp phương 247 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C# thức CopyTo() Thuộc tính thường sử dụng Count, thuộc tính trả số thành phần tập hợp: for(int i = 0; i < myIntArray.Count; i++) { // } Ở sử dụng thuộc tính Count myIntArray để xác định số đối tượng sử dụng mảng Giao diện IComparer Giao diện IComparer cung cấp phương thức Compare(), để so sánh hai phần tử tập hợp có thứ tự Phương thức Compare() thường thực thi cách gọi phương thức CompareTo() đối tượng CompareTo() phương thức có tất đối tượng thực thi IComparable Nếu muốn tạo lớp xếp bên tập hợp cần thiết phải thực thi IComparable .NET Framework cung cấp lớp Comparer thực thi IComparable cung cấp số thực thi cần thiết Phần danh sách mảng sau vào chi tiết việc thực thi IComparable Danh sách mảng Một vấn đề hạn chế kiểu liệu mảng kích thước cố định Nếu trước số lượng đối tượng mảng lưu giữ, khó khăn khai báo kích thước mảng nhỏ (vượt kích thước lưu trữ mảng) kích thước lớn (dẫn đến lãng phí nhớ) Chương trình hỏi người dùng kích thước, thu input từ web site.Tuy nhiên việc xác định số lượng đối tượng session có tính chất tương tác động khơng thích hợp Việc sử dụng mảng có kích thước cố định khơng thích hợp khơng thể đốn trước kích thước mảng cần thiết Lớp ArrayList kiểu liệu mảng mà kích thước gia tăng cách động theo yêu cầu ArrayList cung cấp số phương thức thuộc tính cho thao tác liên quan đến mảng Một vài phương thức thuộc tính quan trọng ArrayList liệt kê bảng 9.3 sau: Phương thức- thuộc tính Adapter() FixedSize() Mảng, Chỉ Mục, Tập Hợp Mục đích Phương thức static tạo wrapper ArrayList cho đối tượng IList Phương thức static nạp chồng trả sanh sách đối tượng wrapper Danh sách có kích thước cố định, thành phần sửa chữa khơng thể thêm hay xóa 248 Ngơn Ngữ Lập Trình C# ReadOnly() Phương thức static nạp chồng trả danh sách lớp wrapper, cho phép đọc Repeat() Phương thức static trả ArrayList mà thành phần chép với giá trị xác định Phương thức static trả danh sách wrapper threadsafe Synchronized() Capacity Count IsFixedSize IsReadOnly Thuộc tính để get hay set số thành phần ArrayList Thuộc tính nhận số thành phần thời mảng Thuộc tính kiểm tra xem kích thước ArrayList có cố định hay khơng Thuộc tính kiểm tra xem ArrayList có thuộc tính đọc hay khơng IsSynchronized Thuộc tính kiểm tra xem ArrayList có thread-safe hay khơng Item() Thiết lập hay truy cập thành phần mảng vị trí xác định Đây mục cho lớp ArrayList SyncRoot Thuộc tính trả đối tượng sử dụng để đồng truy cập đến ArrayList Phương thức public để thêm đối tượng vào ArrayList Add() AddRange() BinarySearch() Clear() Clone() Contains() CopyTo() GetEnumerator() GetRange() Phương thức public để thêm nhiều thành phần ICollection vào cuối ArrayList Phương thức nạp chồng public sử dụng tìm kiếm nhị phận để định vị thành phần xác định ArrayList xếp Xóa tất thành phần từ ArrayList Tạo copy Kiểm tra thành phần xem có chứa mảng hay không Phương thức public nạp chồng để chép ArrayList đến mảng chiều Phương thức public nạp chồng trả enumerator dùng để lặp qua mảng Sao chép dãy thành phần đến ArrayList Insert() Phương thức public nạp chồng trả mục vị trí xuất giá trị Chèn thành phần vào ArrayList InsertRange(0 Chèn dãy tập hợp vào ArrayList IndexOf() 249 Mảng, Chỉ Mục, Tập Hợp Ngôn Ngữ Lập Trình C# LastIndexOf() Phương thức public nạp chồng trả mục trị trí cuối xuất giá trị Remove() Xóa xuất đối tượng xác định Xóa thành phần vị trí xác định RemoveAt() RemoveRange() Reverse() SetRange() Sort() ToArray() TrimToSize() Xóa dãy thành phần Đảo thứ tự thành phần mảng Sao chép thành phần tập hợp qua dãy thành phần ArrayList Sắp xếp ArrayList Sao chép thành phần ArrayList đến mảng Thiết lập kích thước thật chứa thành phần ArrayList Bảng 9.3: Các phương thức thuộc tính ArrayList Khi tạo đối tượng ArrayList, không cần thiết phải định nghĩa số đối tượng mà chứa Chúng ta thêm vào ArrayList cách dùng phương thức Add(), danh sách quan lý đối tượng bên mà lưu giữ Ví dụ 9.12 sau minh họa sử dụng ArrayList  Ví dụ 9.12: Sử dụng ArrayList namespace Programming_CSharp { using System; using System.Collections; // lớp đơn giản để lưu trữ mảng public class Employee { public Employee(int empID) { this.empID = empID; } public override string ToString() { return empID.ToString(); } public int EmpID { get { 250 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C# return empID; } set { empID = value; } } private int empID; } public class Tester { static void Main() { ArrayList empArray = new ArrayList(); ArrayList intArray = new ArrayList(); // đưa vào mảng for( int i = 0; i < 5; i++) { empArray.Add( new Employee(i+100)); intArray.Add( i*5 ); } // in tất nội dung for(int i = 0; i < intArray.Count; i++) { Console.Write(“{0} ”,intArray[i].ToString()); } Console.WriteLine(“\n”); // in tất nội dung mảng for(int i = 0; i < empArray.Count; i++) { Console.Write(“{0} ”,empArray[i].ToString()); } Console.WriteLine(“\n”); Console.WriteLine(“empArray.Count: {0}”, empArray.Count); Console.WriteLine(“empArray.Capacity: {0}”, empArray.Capacity); } } } 251 Mảng, Chỉ Mục, Tập Hợp Ngơn Ngữ Lập Trình C#  Kết quả: 100 10 15 101 102 20 103 104 empArray.Count: empArray.Capacity: 16 Với lớp Array phải định nghĩa số đối tượng mà mảng lưu giữ Nếu cố thêm thành phần vào mảng vượt q kích thước mảng lớp mảng phát sinh ngoại lệ Với ArrayList khơng cần phải khai báo số đối tượng mà lưu giữ ArrayList có thuộc tính Capacity, đưa số thành phần mà ArrayList lưu trữ: public int Capacity {virtual get; virtual set;} Mặc định giá trị Capacity 16, thêm thành phần thứ 17 vào Capacity tự động nhân đơi lên 32 Nếu thay đổi vòng lặp sau: for( int i = 0; i < 17; i++) kết giống sau: 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 10 11 12 13 14 15 16 17 18 19 20 21 empArray.Capacity: 32 Chúng ta làm tay để thay đổi giá trị Capacity hay lớn giá trị Count Nếu thiết lập giá trị Capacity nhỏ giá trị Count, chương trình phát sinh ngoại lệ có kiểu sau ArgumentOutOfRangeException Thực thi IComparable Giống tất tập hợp, ArrayList thực thi phương thức Sort() phép thực việc xếp đối tượng thực thi IComparable Trong ví dụ sao, bổ sung đối tượng Employee để thực thi IComparable: public class Employee: IComparable Để thực thi giao diện IComparable, đối tượng Employee phải cung cấp phương thức CompareTo(): public int CompareTo(Object o) { Employee r = (Employee) o; return this.empID.CompareTo(r.empID); } Phương thức CompareTo() lấy đối tượng làm tham số, đối tượng Employee phải so sánh với đối tượng trả -1 nhỏ đối tượng này, lớn hơn, cuối giá trị hai đối tượng Việc xác định thứ tự Employee 252 Mảng, Chỉ Mục, Tập Hợp ... lớp ListBoxTest thực thi giao diện IEnumerator Câu lệnh foreach gọi để đem enumerator, sử dụng để liệt kê qua thành phần mảng Sau tồn chương trình minh họa cho việc thực thi  Ví dụ 9.11: Tạo lớp... chương trình phiên câu lệnh foreach gọi để truy cập chuỗi ListBox Vòng lặp foreach tự động sử dụng giao diện IEnumerator cách gọi phương thức GetEnumerator() Một đối tượng ListBoxEnumerator tạo. .. Danh sách mảng Một vấn đề hạn chế kiểu liệu mảng kích thước cố định Nếu khơng biết trước số lượng đối tượng mảng lưu giữ, khó khăn khai báo kích thước mảng nhỏ (vượt kích thước lưu trữ mảng) kích

Ngày đăng: 09/05/2021, 14:44

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

  • Đang cập nhật ...

Tài liệu liên quan