Chapter : Arrays
1. Introduction Arrays List or series of values all referenced by the same name and type Refer to particular element in the array by position number Refer to any element by giving the name of the array followed by the position number (subscript) of the element in square brackets ([ ]) First element is the zeroth element First element of array c is c[ 0 ] Windows Programming 1 Chapter 11: Collections Slide 2
Array Terms Element Index Boundaries Individual item in the array Zero based number used to reference the specific elements in the array Must be an integer Boundaries Lower Subscript, 0 by default Upper Subscript Windows Programming 1 Chapter 11: Collections Slide 3
Arrays strName Array [0] Janet Baker [1] George Lee [2] Sue Li [3] [4] [5] [6] [7] [8] [9] Janet Baker George Lee Sue Li Samuel Hoosier Sandra Weeks William Macy Andy Harrison Ken Ford Denny Franks Shawn James Windows Programming 1 Chapter 11: Collections Slide 4
Declaring and Creating Arrays Programmer specifies the type of the elements of the array new operator to allocate dynamically the number of elements in the array Array declarations and initializations need not be in the same statement In arrays of value types, each element contains one value of the declared type Windows Programming 1 Chapter 11: Collections Slide 5
Creating an Array <Datatype> [ ] <NameArray>; Declare the array variable <Datatype> [ ] <NameArray>; Ex: int[ ] c; Create the array; assign to array variable <NameArray> = new <Datatype> <[ARRAY_SIZE]>; Ex : c = new int[ 12 ]; int [ ] c = new int[ 12 ]; Windows Programming 1 Chapter 11: Collections Slide 6
Examples Using Arrays Windows Programming 1 Chapter 11: Collections Slide 7
Using an Array Initializer Optionally, the elements in the array may be assigned values in the statement int[] n = { 10, 20, 30, 40, 50 }; Index Value 10 1 20 2 30 3 40 4 50 Windows Programming 1 Chapter 11: Collections Slide 8
Using an Array Initializer Index Value Ace 1 Deuce 2 Three 3 Four 4 Five 5 Six string[] faces = { "Ace", "Deuce", "Three", "Four", "Five", "Six"}; Windows Programming 1 Chapter 11: Collections Slide 9
Properties and methods of array array_name.Length: return size of array array_name.GetValue (int index): return an object at position index. array_name[int index]: return an object at position index. array_name.SetValue (object value, int index): add or modify an object at position index array_name[int index] = value: add or modify an object at position index Windows Programming 1 Chapter 11: Collections Slide 10
Passing Arrays to Methods Pass arrays as arguments to methods by specifying the name of the array (no brackets) Arrays are passed by reference Individual array elements are passed by value Windows Programming 1 Chapter 11: Collections Slide 11
Passing Arrays to Methods Windows Programming 1 Chapter 11: Collections Slide 12
Passing Arrays to Methods Windows Programming 1 Chapter 11: Collections Slide 13
Passing Arrays to Methods Truy xuất qua vị trí Truy xuất qua foreach long tongmang(int[] A) { int i = 0, x; long t = 0; while (i < A.Length) x = A[i]; t += x; i++; } return t; long tongmangForeach(int[] A) foreach (int x in A) Windows Programming 1 Chapter 11: Collections Slide 14
2. Multiple-Subscripted Arrays Require two or more subscripts to identify a particular element Multidimensional arrays with two dimensions are often used to represent tables of values consisting of information arranged in rows and columns Rectangular arrays Often represent tables in which each row is the same size and each column is the same size By convention, first subscript identifies the element’s row and the second subscript the element’s column Windows Programming 1 Chapter 11: Collections Slide 15
Multiple-Subscripted Arrays Row 0 Row 1 Row 2 Column 1 Column 0 Column 2 Column 3 a[0, 0] a[0, 3] a[0, 1] a[0, 2] a[1, 0] a[1, 3] a[1, 1] a[1, 2] a[2, 0] a[2, 3] a[2, 2] Column index (or subscript) Row index (or subscript) Array name a [2, 1] Windows Programming 1 Chapter 11: Collections Slide 16
Multiple-Subscripted Arrays DataType[ , ] ArrayName; ArrayName = new DataType [rowSize, colSize]; DataType [ , ] ArrayName = new DataType [rowSize, colSize]; Windows Programming 1 Chapter 11: Collections Slide 17
Multiple-Subscripted Arrays GetLength (int x) GetLength(0) GetLength(1) Dùng {} để nhóm các dòng trong mảng, không cần ghi số phần tử mảng khi khai báo ([,]) có khởi tạo, Vì compiler xác định số dòng bằng cách đếm số lượng {}, tính số cột bằng cách đếm số phần tử trong {} Hàm GetLength(x) trả về kích thước của chiều thứ x trong mảng. Ví dụ, b.GetLength() trà về kích thước của mảng 1 chiều. b.GetLength(0) trà về kích thước dòng. b.GetLength(1) trà về kích thước cột Windows Programming 1 Chapter 11: Collections Slide 18
Multiple-Subscripted Arrays (Jagged Arrays) DataType[ ][ ] ArrayName; ArrayName = new DataType[Size][ ]; DataType[ ][ ] ArrayName = new DataType[Size][ ]; Khi chúng ta tạo một mảng đa chiều kích thước khác nhau thì chúng ta khai báo số dòng trong mảng trước. Sau đó với mỗi dòng sẽ giữ một mảng, có kích thước bất kỳ. Những mảng này được khai báo riêng. Sau đó chúng ta khởi tạo giá trị các thành phần trong những mảng bên trong. Windows Programming 1 Chapter 11: Collections Slide 19
Example int [,] a= new int[,]{{1,2,3},{4,5,6}} int TongMang(int[,] a)//tong mang 2 chieu { long T=0; for (int i = 0; i < a.GetLength(0); i++) for(int j = 0; j < a.GetLength(1); j++) T=T+a[i,j]; return T; } Windows Programming 1 Chapter 11: Collections Slide 20
Example Windows Programming 1 Chapter 11: Collections Slide 21
Example Windows Programming 1 Chapter 11: Collections Slide 22
foreach Repetition Structure The foreach repetition structure is used to iterate through values in data structures such as arrays No counter A variable is used to represent the value of each element Windows Programming 1 Chapter 11: Collections Slide 23
foreach Repetition Structure Windows Programming 1 Chapter 11: Collections Slide 24
ArrayList (Danh sách mảng) Một vấn đề hạn chế của kiểu dữ liệu mảng là kích thước cố định. Chương trình của chúng ta có thể hỏi người dùng về kích thước tuy nhiên không thực tế. Windows Programming 1 Chapter 11: Collections Slide 25
ArrayList (Danh sách mảng) Lớp ArrayList là một kiểu dữ liệu mảng mà kích thước của nó được gia tăng một cách động theo yêu cầu mà không cần cho biết trước kích thước. Khi tạo đối tượng ArrayList, không cần thiết phải xác định số đối tượng mà nó sẽ chứa. Windows Programming 1 Chapter 11: Collections Slide 26
ArrayList methods Add (object value) Insert (int index, object value) Phương thức public để thêm một đối tượng vào ArrayList Insert (int index, object value) Chèn một thành phần vào trong ArrayList Remove (object obj) Xóa sự xuất hiện đầu tiên của một đối tượng xác định RemoveAt (int index) Xóa một thành phần ở vị trí index. Count Thuộc tính nhận số phần tử hiện thời trong mảng Clear() Xóa tất cả các thành phần từ ArrayList Contains (object item) Kiểm tra một thành phần xem có chứa trong mảng hay không, trả về true hoặc false IndexOf (object value) Trả về chỉ mục vị trí đầu tiên xuất hiện value
Các thao tác với ArrayList BinarySearch() Tìm xem một phần tử có trong ArrayList không, sử dụng phương pháp tìm kiếm nhị phân Clone() Tạo một bản copy CopyTo() Sao chép ArrayList đến mảng một chiều RemoveRange() Xóa một dãy các thành phần Reverse() Đảo thứ tự các thành phần trong ArrayList SetRange() Sao chép các thành phần của tập hợp qua dãy những thành phần trong ArrayList Sort() Sắp xếp ArrayList
ArrayList Windows Programming 1 Chapter 11: Collections Slide 29
ArrayList Windows Programming 1 Chapter 11: Collections Slide 30
HashTable Hashtable (bảng băm) là một kiểu từ điển được tối ưu cho việc truy cập được nhanh. Key Value Windows Programming 1 Chapter 11: Collections Slide 31
HashTable Add (object key, object value) Thêm một thành phần mới với khóa và giá trị xác định. Values Thuộc tính trả về một ICollection chứa các giá trị Keys Thuộc tính trả về một ICollection chứa các khóa trong hashtable. Remove (object obj) Xóa một thành phần với khóa xác định. Count Thuộc tính trả về số thành phần trong hashtable Clear() Xóa tất cả đối tượng trong hashtable. Trong một Hashtable, mỗi giá trị được lưu trữ trong một vùng. Mỗi vùng được đánh số tương tự như là từng offset trong mảng. Do khóa có thể không phải là số nguyên, nên phải chuyển các khóa thành các khóa số để ánh xạ đến vùng giá trị được đánh số. Mỗi khóa phải cung cấp phương thức GetHashCode() để nhận giá trị mã hóa thành số của nó. Chúng ta nhớ rằng mọi thứ trong C# đều được dẫn xuất từ lớp object. Lớp object cung cấp một phương thức ảo là GetHashCode(), cho phép các lớp dẫn xuất tự do kế thừa hay viết lại. Việc thực thi thông thường của phương thức GetHashCode() đối với chuỗi thì đơn giản bằng cách cộng các giá trị Unicode của từng ký tự lại rồi sau đó sử dụng toán tử chia lấy dư để nhận lại một giá trị từ 0 đến số vùng được phân của hashtable. Ta không cần phải viết lại phương thức này với kiểu chuỗi. Khi chúng ta thêm giá trị vào Hashtable thì Hashtable sẽ gọi phương thức GetHashCode() cho mỗi giá trị mà chúng ta cung cấp. Phương thức này trả về một số nguyên, xác định vùng mà giá trị được lưu trữ trong hashtable.Dĩ nhiên là có thể nhiều giá trị nhận chung một khóa tức là cùng một vùng trong hashtable, điều này gọi là sự xung đột. Có một vài cách để giải quyết sự xung đột này. Trong đó cách chung nhất và được hỗ trợ bởi CLR là cho mỗi vùng duy trì một danh sách có thứ tự các giá trị. Khi chúng ta truy cập một giá trị trong hashtable, chúng ta cung cấp một khóa. Một lần nữa Hashtable gọi phương thức GetHashCode() trên khóa và sử dụng giá trị trả về để tìm vùng tương ứng. Nếu chỉ có một giá trị thì nó sẽ trả về, nếu có nhiều hơn hai giá trị thì việc tìm kiếm nhị phân sẽ được thực hiện trên những nội dung của vùng đó. Bởi vì có một vài giá trị nên việc tìm kiếm này thực hiện thông thường là rất nhanh. Windows Programming 1 Chapter 11: Collections Slide 32
HashTable Contains (object item) ContainsKey(object key) Xác định xem một thành phần có trong hashtable, trả về true hoặc false ContainsKey(object key) Xác định xem hashtable có chứa một khóa xác định, trả về true hoặc false ContainsValue(object value) Xác định xem hashtable có chứa một giá trị xác định, trả về true hoặc false hashTable [object key] Trả về giá trị mang khóa truyền vào Trong một Hashtable, mỗi giá trị được lưu trữ trong một vùng. Mỗi vùng được đánh số tương tự như là từng offset trong mảng. Do khóa có thể không phải là số nguyên, nên phải chuyển các khóa thành các khóa số để ánh xạ đến vùng giá trị được đánh số. Mỗi khóa phải cung cấp phương thức GetHashCode() để nhận giá trị mã hóa thành số của nó. Chúng ta nhớ rằng mọi thứ trong C# đều được dẫn xuất từ lớp object. Lớp object cung cấp một phương thức ảo là GetHashCode(), cho phép các lớp dẫn xuất tự do kế thừa hay viết lại. Việc thực thi thông thường của phương thức GetHashCode() đối với chuỗi thì đơn giản bằng cách cộng các giá trị Unicode của từng ký tự lại rồi sau đó sử dụng toán tử chia lấy dư để nhận lại một giá trị từ 0 đến số vùng được phân của hashtable. Ta không cần phải viết lại phương thức này với kiểu chuỗi. Khi chúng ta thêm giá trị vào Hashtable thì Hashtable sẽ gọi phương thức GetHashCode() cho mỗi giá trị mà chúng ta cung cấp. Phương thức này trả về một số nguyên, xác định vùng mà giá trị được lưu trữ trong hashtable.Dĩ nhiên là có thể nhiều giá trị nhận chung một khóa tức là cùng một vùng trong hashtable, điều này gọi là sự xung đột. Có một vài cách để giải quyết sự xung đột này. Trong đó cách chung nhất và được hỗ trợ bởi CLR là cho mỗi vùng duy trì một danh sách có thứ tự các giá trị. Khi chúng ta truy cập một giá trị trong hashtable, chúng ta cung cấp một khóa. Một lần nữa Hashtable gọi phương thức GetHashCode() trên khóa và sử dụng giá trị trả về để tìm vùng tương ứng. Nếu chỉ có một giá trị thì nó sẽ trả về, nếu có nhiều hơn hai giá trị thì việc tìm kiếm nhị phân sẽ được thực hiện trên những nội dung của vùng đó. Bởi vì có một vài giá trị nên việc tìm kiếm này thực hiện thông thường là rất nhanh.
Example 1 Windows Programming 1 Chapter 11: Collections Slide 34
Example 2 Windows Programming 1 Chapter 11: Collections Slide 35
Example 2 Windows Programming 1 Chapter 11: Collections Slide 36
Finish Windows Programming 1 Chapter 11: Collections Slide 37