Bài giảng Lập trình C# - Bài 7: Mảng - Lê Viết Mẫn

pdf 50 trang cucquyet12 5500
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C# - Bài 7: Mảng - Lê Viết Mẫn", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_c_bai_7_mang_le_viet_man.pdf

Nội dung text: Bài giảng Lập trình C# - Bài 7: Mảng - Lê Viết Mẫn

  1. Mảng v 1.0 - 11/2012 Lê Viết Mẫn - lvman@hce.edu.vn 1 Mảng Monday, September 9, 13
  2. chúng ta đã học Programs = Data Structure + Algorithms Cấu trúc chương trình Tuần tự Rẽ nhánh Lặp Hàm Tổ chức dữ liệu Kiểu dữ liệu bool char short int long float double string Lê Viết Mẫn - lvman@hce.edu.vn 2 Mảng Monday, September 9, 13
  3. chúng ta sẽ học Programs = Data Structure + Algorithms Cấu trúc chương trình Tuần tự Rẽ nhánh Lặp Hàm Tổ chức dữ liệu Kiểu dữ liệu bool char short int long float double string array Lê Viết Mẫn - lvman@hce.edu.vn 3 Mảng Monday, September 9, 13
  4. Nội dung 1. Mảng 2. Chuỗi ký tự 3. Đối số dòng lệnh 4. Generics Lê Viết Mẫn - lvman@hce.edu.vn 4 Mảng Monday, September 9, 13
  5. Cơ bản về Mảng Array Lê Viết Mẫn - lvman@hce.edu.vn 5 Mảng Monday, September 9, 13
  6. Mảng • Mảng là một tập liên tục có thứ tự các thành phần dữ liệu cùng kiểu được tham chiếu bằng cùng một tên định danh và một chỉ số • Giá trị của chỉ số nằm trong khoảng 0 size - 1 • C# kiểm tra phạm vi của mảng • Chương trình bị crash khi truy xuất thành phần vượt quá phạm vi mảng • Mảng là kiểu tham chiếu, được cấp phát trong bộ nhớ heap • Tất cả các mảng đều được tạo ra từ lớp System.Array • Trước khi sử dụng mảng, ta cần thực hiện 3 bước : 1. Khai báo mảng 2. Khởi tạo mảng (cấp phát bộ nhớ cho mảng) 3. Khởi gán giá trị cho mảng Lê Viết Mẫn - lvman@hce.edu.vn 6 Mảng Monday, September 9, 13
  7. Khai báo • Các khai báo mảng bao gồm kiểu dữ liệu, các cặp dấu ngoặc vuông và tên mảng • Số lượng dấu phẩy hoặc cặp ngoặc vuông thể hiện số chiều của mảng • Mảng được đặt tên theo quy tắc đặt tên biến type[] name; //mảng một chiều type[,] name; // mảng hai chiều type[][] name; // mảng hai chiều lởm chớm - Jagged type[][,] name; Lê Viết Mẫn - lvman@hce.edu.vn 7 Mảng Monday, September 9, 13
  8. Khởi tạo Sử dụng từ khoá new • // mảng jagged name = new type[sizes]; name = new type[sizes1][]; name = new type[sizes1,sizes2]; name[0] = new type[size2]; name[1] = new type[size3]; name[size1 - 1] = new type[sizen]; • Các size có thể là một hằng số, biến, giá trị của biểu thức • Sau khi cấp phát bộ nhớ thì số chiều, kích thước mỗi chiều là không thể thay đổi (trừ khi cấp phát lại) • Các thành phần dữ liệu của mảng sẽ nhận giá trị mặc nhiên theo kiểu dữ liệu của mảng • Có thể vừa khai báo vừa khởi tạo mảng trong cùng một câu lệnh type[] name = new type[sizes]; type[,] name = new type[sizes1,sizes2]; type[][] name = new type[sizes1][]; Lê Viết Mẫn - lvman@hce.edu.vn 8 Mảng Monday, September 9, 13
  9. Mảng một chiều int[] test = new int[10]; // space for 10 ints 0 1 2 3 4 5 6 7 8 9 test[0] test[5] Lê Viết Mẫn - lvman@hce.edu.vn 9 Mảng Monday, September 9, 13
  10. Mảng hai chiều float[,] test_score = new float[4,10]; // space for 40 floats 0 1 2 3 4 5 6 7 8 9 0 1 2 3 test_score[0,0] test_score[2,3] test_score[3,2] test_score[3,9] Lê Viết Mẫn - lvman@hce.edu.vn 10 Mảng Monday, September 9, 13
  11. Mảng lởm chởm hai chiều float[][] jagged = new float[4][]; jagged[0] = new float[10]; jagged[1] = new float[6]; jagged[2] = new float[8]; jagged[3] = new float[3]; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 jagged[0][0] jagged[2][5] jagged[0][9] jagged[3][2] Lê Viết Mẫn - lvman@hce.edu.vn 11 Mảng Monday, September 9, 13
  12. Mảng ba chiều double[,,] class_score = new double[5,5,10]; // space for 250 doubles , , , , , , , , Lê Viết Mẫn - lvman@hce.edu.vn 12 Mảng Monday, September 9, 13
  13. Khởi gán - mảng một chiều • Gán giá trị cho từng thành phần của mảng int[] ages = new int[4]; ages[0] = 20; ages[1] = 23; ages[2] = 23; ages[3] = 0; • Vừa khai báo, khởi tạo và khởi gán giá trị cho mảng int[] ages = {20, 23, 23, 0}; int[] ages = new int[5] {20, 23, 23, 0}; int[] ages = new int[] {20, 23, 23, 0}; • Đồng thời khởi tạo và gán giá trị int[] ages; ages = new int[] {20, 23, 23, 0}; ages = {20, 23, 23, 0}; // sai Lê Viết Mẫn - lvman@hce.edu.vn 13 Mảng Monday, September 9, 13
  14. Khởi gán - mảng nhiều chiều int[,] rects = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; int[,] rects = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; int[,] rects; rects = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; int[,] rects = new int[4,2]; rects[0,0] = 1; rects[0,1] = 2; rects[2,1] = 6; Lê Viết Mẫn - lvman@hce.edu.vn 14 Mảng Monday, September 9, 13
  15. Khởi gán - mảng lởm chởm int[][] jagged = new int[4][]; jagged = new int[5] {1, 2, 3, 4, 5}; jagged = new int[2] {3, 4}; jagged = new int[3] {5, 6, 7}; jagged = new int[5] {6, 7, 8, 9, 10}; int[][] jagged = new int[][] { new int[] {1, 2, 3, 4, 5}, new int[] {3, 4}, new int[] {5, 6, 7}, new int[] {6, 7, 8, 9, 10} }; int[][,] jagged = new int[3][,]; jagged[0][0,0] = 1; jagged[0][0,1] = 2; jagged[2][1,1] = 6; Lê Viết Mẫn - lvman@hce.edu.vn 15 Mảng Monday, September 9, 13
  16. Sử dụng mảng • Các chỉ số có thể là kết quả của một biểu thức • Mảng thường được sử dụng cùng với các vòng lặp (for, while) • Mỗi vòng lặp cho một chiều của mảng • Chỉ số chạy từ 0 đến size - 1 (hoặc < size) // Nhập giá trị cho mảng for (int i = 0; i < test.Length; i++) test[i] = int.Parse(Console.ReadLine()); int[] inputs = new int[max]; int size = 0; string line; // In ra màn hình giá trị của mảng for (i = 0; i < 10; i++) Console.Write("Enter first number:"); for (j = 0; j < 4; j++) line = Console.ReadLine(); Console.Write(“{0} ”,test_score[i,j]); while (line != null) { // In mảng jagged inputs[size] = int.Parse(line); for (int i = 0; i < 4; i++) size++; { Console.Write("Enter next number:"); for (int j = 0; j < jagged[i].Length; j++) line = Console.ReadLine(); Console.Write(“{0} ”, jagged[i][j]); } Console.WriteLine(); } Lê Viết Mẫn - lvman@hce.edu.vn 16 Mảng Monday, September 9, 13
  17. foreach • Cho phép duyệt qua tuần tự từng phần tử một của một mảng, một danh sách foreach (type identifier in expression) statement; foreach (int t in test) Console.Write(“{0} ”, t); foreach (int t in test_score) Console.Write(“{0} ”, t); • Phù hợp hơn với mảng một chiều hoặc các danh sách Lê Viết Mẫn - lvman@hce.edu.vn 17 Mảng Monday, September 9, 13
  18. Sao chép mảng • Biến mảng có kiểu tham chiếu • Khi viết A = B; A 0x0a10 a a a a a a B 0x0a10 • Có thể sao chép nội dung từng thành phần trong B sang A for (int i = 0; i < A.Length; i++) A[i] = B[i]; Lê Viết Mẫn - lvman@hce.edu.vn 18 Mảng Monday, September 9, 13
  19. Mảng là trị trả về của hàm static string[] GetStringArray() { string[] strings = {“Hello”, “from”, “CSLT”}; return strings; } static void Main() { string[] strs = GetStringArray(); foreach (string s in strs) Console.WriteLine(s); } Lê Viết Mẫn - lvman@hce.edu.vn 19 Mảng Monday, September 9, 13
  20. Truyền mảng cho hàm • Có thể truyền một mảng đã được khởi tạo cho một hàm • Trong định nghĩa hàm, tham số được khai báo như khai báo mảng static void function(int[] arg) static void function(int[,] arg) static void function(int[][] arg) • Có thể truyền bất kỳ mảng nào cùng số chiều và cùng kiểu cho các hàm này static int Main() static void PrintArray(int[] a) { { int[] firstArray = {5, 10, 15}; foreach (int n in a) int[] secondArray = {2, 4, 6, 8}; Console.Write(“{0} ”, n); PrintArray(firstArray); Console.WriteLine(); PrintArray(secondArray); } return 0; } • Có thể dùng các tham chiếu ref và out cho các tham số mảng Lê Viết Mẫn - lvman@hce.edu.vn 20 Mảng Monday, September 9, 13
  21. Tham số params • Từ khoá params cho phép truyền cho hàm một lượng tham số có kiểu xác định thông qua chỉ một tham số duy nhất • Có thể truyền vào một mảng hoặc danh sách các đối số (phân cách nhau bằng dấu phẩy) • Nếu còn có nhiều tham số khác thì, tham số params phải được đặt ở cuối static double CalculateAverage(params double[] values) { double sum = 0; for (int i = 0; i < values.Length; i++) sum += values[i]; return sum / values.Length; } double average; average = CalculateAverage(4.0, 3.2, 5.7, 64.22, 87.2); double[] data = {4.0, 3.2, 5.7}; Main() average = CalculateAverage(data); Lê Viết Mẫn - lvman@hce.edu.vn 21 Mảng Monday, September 9, 13
  22. System.Array Hàm tĩnh này gán giá trị mặc định (theo kiểu dữ liệu của mảng) cho tất Clear() cả các thành phần của mảng Copy() Hàm cho phép sao chép một phần của mảng này lên mảng khác Hàm này được sử dụng để sao chép các thành phần của mảng nguồn CopyTo() sang mảng đích GetLength() Hàm này trả về số lượng thành phần trên một chiều chỉ định của mảng Hàm này trả về chỉ số của giá trị xuất hiện đầu tiên trong mảng một IndexOf() chiều LastIndexOf() Hàm trả về chỉ số của giá trị xuất hiện cuối cùng trên mảng một chiều Length Thuộc tính này trả ra số lượng thành phần của mảng Rank Thuộc tính này trả ra số chiều của mảng Hàm tĩnh này đảo ngược thứ tự các thành phần của một mảng một Reverse() chiều Sort() Hàm tĩnh này sắp xếp một mảng một chiều kiểu cơ bản Lê Viết Mẫn - lvman@hce.edu.vn 22 Mảng Monday, September 9, 13
  23. Một số ví dụ Lê Viết Mẫn - lvman@hce.edu.vn 23 Mảng Monday, September 9, 13
  24. Ví dụ - nhập xuất Đọc 10 số nguyên vào mảng numbers rồi in chúng theo thứ tự ngược lại static int Main() { int[] numbers = new int[10]; Console.Write("Enter ten numbers: "); for (int i = 0; i < 10; i++) numbers[i] = int.Parse(Console.ReadLine()); for (int i = 0; i < 10; i++) Console.Write("{0} ", numbers[9-i]); Console.WriteLine(); return 0; } Lê Viết Mẫn - lvman@hce.edu.vn 24 Mảng Monday, September 9, 13
  25. Ví dụ Đọc và số thẻ sinh viên, điểm hai bài thi và in ra danh sách điểm trung bình của từng sinh viên const int MAX = 100; static void Main(string[] args) { int[] idNumbers = new int[MAX]; int[] exam1 = new int[MAX]; int[] exam2 = new int[MAX]; int size, i; string line; // Doc so the sinh vien va diem bai thi size = 0; Console.Write("Enter ID number and two exam grades: "); line = Console.ReadLine(); while (line != null) { string[] items = line.Split(); idNumbers[size] = int.Parse(items[0]); exam1[size] = int.Parse(items[1]); exam2[size] = int.Parse(items[2]); Console.Write("Enter ID number and two exam grades: "); line = Console.ReadLine(); size++; } // In ra diem trung binh Console.Write("\n\nIDNumbers\tAverage\n\n"); for (i = 0; i < size; i++) Console.WriteLine("{0}\t{1}", idNumbers[i], (exam1[i] + exam2[i])/2); Console.ReadKey(); } Lê Viết Mẫn - lvman@hce.edu.vn 25 Mảng Monday, September 9, 13
  26. Ví dụ - cộng ma trận ⎡ a a a ⎤ ⎡ b b b ⎤ ⎢ 0,0 0,1  0,n−1 ⎥ ⎢ 0,0 0,1  0,n−1 ⎥ ⎢ ⎥ ⎢ ⎥ a1,0 a1,1  a1,n−1 b1,0 b1,1  b1,n−1 A = ⎢ ⎥ B = ⎢ ⎥ ⎢     ⎥ ⎢     ⎥ ⎢ a a  a ⎥ ⎢ b b  b ⎥ ⎢ m−1,0 m−1,1 m−1,n−1 ⎥ ⎢ m−1,0 m−1,1 m−1,n−1 ⎥ ⎣ ⎦ ⎣ ⎦ C = A + B → ci, j = ai, j + bi, j double[,] a = new double[m,n]; double[,] b = new double[m,n]; double[,] c = new double[m,n]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) c[i,j] = a[i,j] + b[i,j]; Lê Viết Mẫn - lvman@hce.edu.vn 26 Mảng Monday, September 9, 13
  27. Ví dụ - nhân ma trận p−1 C = AB → ci, j = ∑ai,kbk, j k =0 double[,] a = new double[m,p]; double[,] b = new double[p,n]; double[,] c = new double[m,n]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { c[i,j] = 0; for (k = 0; k < p; k++) c[i,j] += a[i,k] + b[k,j]; } Lê Viết Mẫn - lvman@hce.edu.vn 27 Mảng Monday, September 9, 13
  28. Chuỗi ký tự Lê Viết Mẫn - lvman@hce.edu.vn 28 Mảng Monday, September 9, 13
  29. Chuỗi ký tự • Sử dụng từ khoá string để khai báo một chuỗi ký tự • Tất cả các chuỗi đều dẫn xuất từ lớp System.String string st = "This is the initial string content"; st = "This is a different string content"; • Các chuỗi này là “bất di bất dịch” • giá trị của nó là không thể thay đổi một khi đã được tạo ra • các hàm sẽ trả ra các thay đổi trên một chuỗi mới, chuỗi gốc vẫn nguyên vẹn • Có thể xem chuỗi ký tự như một mảng một chiều các ký tự kết thúc bằng null (\0) • Mảng dài hơn 1 ký tự so với chuỗi ký tự mà nó lưu trữ • Trình biên dịch sẽ tự động thêm null vào cuối các hằng chuỗi st T h i s i s \0 Stack Heap Lê Viết Mẫn - lvman@hce.edu.vn 29 Mảng Monday, September 9, 13
  30. Chuỗi ký tự • Các hằng chuỗi được bao trong cặp dấu nháy kép • Có thể bao gồm các ký tự escape \’ ‘ \n dòng mới \” “ \r về đầu dòng \\ \ \t tab • Chuỗi đúng nguyên văn (verbatim string) - bắt đầu bằng ký tự @ • dấu \ không được xem là ký tự escape, dấu “ phải được gấp đôi • chuỗi có thể được viết trên nhiều dòng string path = "\\\\MyApp\\bin\\Debug"; string verPath = @"\\MyApp\bin\Debug"; string oneline = "Line One\nLine Two"; string twoline = @"Line One Line Two"; Lê Viết Mẫn - lvman@hce.edu.vn 30 Mảng Monday, September 9, 13
  31. System.String Length Thuộc tính trả ra độ dài của chuỗi Compare() Hàm tĩnh so sánh hai chuỗi Contains() Hàm xác định một chuỗi có chứa một chuỗi con được chỉ định Equals() Hàm kiểm tra sự giống nhau về nội dung của hai chuỗi Hàm tĩnh định dạng một chuỗi sử dụng các thành tố cơ sở (số, Format() chuỗi) và các token giữ chỗ Insert() Hàm này chèn một chuỗi vào chuỗi đã cho Remove() Hàm này trả ra bản sao của một chuỗi với những thay đổi (xoá Replace() hoặc thay thế ký tự) Hàm này trả ra một mảng kiểu string chứa các chuỗi con được Split() tách ra bằng các ký tự hoặc chuỗi phân tách Trim() Hàm này xoá ở đầu và cuối chuỗi các ký tự được chỉ định ToUpper() Các hàm này tạo ra một bản sao của chuỗi hiện tại với tất cả các ToLower() ký tự được in hoa hoặc in thường Lê Viết Mẫn - lvman@hce.edu.vn 31 Mảng Monday, September 9, 13
  32. Một số thao tác với chuỗi string s1 = "Programming"; string s2 = " C#"; • Truy xuất chuỗi // in ra độ dài chuỗi Console.Write(s1.Length); Console.Write(s1[3]); // in ký tự g • Nối chuỗi // hai cách như nhau string s3 = s1 + s2; string s4 = string.Concat(s1, s2); Lê Viết Mẫn - lvman@hce.edu.vn 32 Mảng Monday, September 9, 13
  33. Một số thao tác với chuỗi • So sánh chuỗi // 0 - bằng nhau // >0 - s1 lớn hơn s2 // <0 - s1 nhỏ hơn s2 int result = string.Compare(s1,s2); // không phân biệt chữ hoa, chữ thường result = string.Compare(s1,s2,true); • So sánh bằng if (s1 == s2) Console.Write("bằng nhau"); if (s1.Equals(s2)) Console.Write("bằng nhau"); if (string.Equals(s1, s2)) Console.Write("bằng nhau"); Lê Viết Mẫn - lvman@hce.edu.vn 33 Mảng Monday, September 9, 13
  34. Một số thao tác với chuỗi • Sao chép string s5 = string.Copy(s1); string s6 = s1; • Tìm kiếm chuỗi // vị trí trong chuỗi gốc, tính từ 0 Console.Write("Vị trí hai chữ m là ", s1.IndexOf("mm")); if (s2.EndsWith("#")) Console.Write("đúng vậy"); if (s2.StartsWith(" ")) Console.Write("đúng vậy"); • Chèn string s7 = s3.Insert(12, "language"); Lê Viết Mẫn - lvman@hce.edu.vn 34 Mảng Monday, September 9, 13
  35. Tách chuỗi (split) string s1 = "Trường Đại học Kinh tế, Đại học Huế"; // tạo mảng các ký tự được dùng để tách từ char[] delims = { ' ', ',' }; // kết quả tách được trả ra trong một mảng string string[] strs = s1.Split(delims, StringSplitOptions.RemoveEmptyEntries); foreach (string st in strs) Console.WriteLine(st); Lê Viết Mẫn - lvman@hce.edu.vn 35 Mảng Monday, September 9, 13
  36. System.Text.StringBuilder • Lớp StringBuilder cho phép tạo và thay đổi các chuỗi • Khi bạn gọi các hàm của kiểu này, bạn thay đổi trực tiếp nội dung của chuỗi StringBuilder sb = new StringBuilder("FANTASTIC GAMES"); sb.Append("\n"); sb.AppendLine("Half Life"); sb.AppendLine("Beyond Good and Evil"); sb.AppendLine("Deus Ex 2"); sb.AppendLine("System Shock"); Console.WriteLine(sb.ToString()); sb.Replace("2", "Invisible War"); Console.WriteLine(sb.ToString()); Console.WriteLine("sb has {0} chars.", sb.Length); Console.WriteLine(); Lê Viết Mẫn - lvman@hce.edu.vn 36 Mảng Monday, September 9, 13
  37. Đối số dòng lệnh Lê Viết Mẫn - lvman@hce.edu.vn 37 Mảng Monday, September 9, 13
  38. Đối số dòng lệnh (1/2) • Nhiều chương trình chúng ta viết là không có giao diện với các cửa sổ • Các đối số dòng lệnh sẽ được truyền cho chương trình thông qua lời gọi chương trình dir /s /w /p C:\”Program Files”\ • Các đối số được truyền thông qua hàm Main static void Main(string[] args) static int Main(string[] args) • args - mảng các chuỗi Lê Viết Mẫn - lvman@hce.edu.vn 38 Mảng Monday, September 9, 13
  39. Đối số dòng lệnh (2/2) static int Main(string[] args) C:\>argdemo hello world from Hue args[0] h e l l o \0 args[1] w o r l d \0 args[2] f r o m \0 args[3] H u e \0 foreach (string st in args) process(st); for (i = 1; i < args.Lenght; i++) process(args[i]); Lê Viết Mẫn - lvman@hce.edu.vn 39 Mảng Monday, September 9, 13
  40. Ví dụ Viết chương trình tính tổng một dãy số được nhập vào theo đối số dòng lệnh C:\>sum 2 3 4 5 6 static int Main(string[] args) { if (args.Length \n"); return 1; } int sum = 0; foreach (string st in args) { sum += int.Parse(st); } Console.Write("Sum of numbers : {0}", sum); Console.ReadKey(); return 0; } Lê Viết Mẫn - lvman@hce.edu.vn 40 Mảng Monday, September 9, 13
  41. Generics Lê Viết Mẫn - lvman@hce.edu.vn 41 Mảng Monday, September 9, 13
  42. System.Collections • Mảng là cấu trúc dữ liệu (container) cơ bản nhất cho việc lưu trữ dữ liệu • Hữu dụng cho việc quản lý lượng nhỏ dữ liệu • Kích thước mảng là cố định • Cần có các cấu trúc dữ liệu mềm dẻo hơn • tăng, giảm kích thước tự động, dễ dàng • Namespace System.Collections ra đời cùng với phiên bản .NET 1.0 • Cung cấp một vài CTDL : ArrayList, Hashtable, Queue, SortedList, Stack • Nhưng các CTDL này mặc phải một số vấn đề : • Hiệu năng • An toàn kiểu Lê Viết Mẫn - lvman@hce.edu.vn 42 Mảng Monday, September 9, 13
  43. Generics • Generics là kỹ thuật được đổi tên và có cải tiến của kỹ thuật khuôn hình trong các ngôn ngữ lập trình hướng đối tượng • Khuôn hình là kỹ thuật cho phép định nghĩa các hàm, lớp, cấu trúc dữ liệu, chấp nhận kiểu dữ liệu hình thức tại thời điểm biên dịch và trong thời gian chạy nó mới nhận kiểu dữ liệu cụ thể • Từ bản 2.0, .NET cung cấp các generics sau trong namespace System.Collections.Generic • Dictionary • SortedDictionary • List • SortedSet • LinkedList • Stack • Queue • HashSet Lê Viết Mẫn - lvman@hce.edu.vn 43 Mảng Monday, September 9, 13
  44. List Add() Hàm chèn thêm một phần tử vào cuối danh sách Hàm sử dụng thuật toán tìm kiếm nhị phân để tìm kiếm một phần BinarySearch() tử nào đó Clear() Hàm xoá tất cả các phần tử trong danh sách Contains() Hàm xác định sự tồn tại của một phần tử xác định Count Thuộc tính cho biết số lượng phần tử hiện tại trong danh sách Hàm tìm kiếm một giá trị xác định và trả ra vị trí xuất hiện đầu tiên IndexOf() tính từ đầu danh sách của giá trị đó trong danh sách Insert() Hàm này chèn một phần tử mới vào danh sách Hàm tìm kiếm một giá trị xác định và trả ra vị trí xuất hiện đầu tiên LastIndexOf() tính từ cuối danh sách của giá trị đó trong danh sách Remove() Hàm xoá một phần tử xác định RemoveAt() Hàm xoá một phần tử tại vị trí chỉ định Reverse() Hàm đảo ngược thứ tự các thành phần của danh sách Sort() Hàm thực hiện sắp xếp danh sách theo thứ tự nào đó ToArray() Hàm trả ra danh sách dưới dạng một mảng Lê Viết Mẫn - lvman@hce.edu.vn 44 Mảng Monday, September 9, 13
  45. Ví dụ • Khai báo, khởi tạo và khởi gán giá trị // khởi tạo danh sách và khởi gán giá trị List ageList = new List { 20, 21, 24, 25 }; • Duyệt mảng // dùng foreach để duyệt qua mảng foreach (int age in ageList) Console.Write("{0} ", age); • Chèn thêm phần tử mới // chèn vào cuối danh sách ageList.Add(21); // chèn vào vị trí thứ 3 trong danh sách ageList.Insert(2, 45); Lê Viết Mẫn - lvman@hce.edu.vn 45 Mảng Monday, September 9, 13
  46. Ví dụ • Tìm kiếm và xoá // Contains trả ra giá trị true hoặc false if (ageList.Contains(21)) ageList.Remove(21); // BinarySearch, IndexOf, LastIndexOf là giống nhau // trả ra vị trí của giá trị tìm được (0 → count - 1) // nếu không có thì trả ra giá trị = 0) ageList.RemoveAt(index); • Chuyển ra mảng int[] ageArray = ageList.ToArray(); Lê Viết Mẫn - lvman@hce.edu.vn 46 Mảng Monday, September 9, 13
  47. Stack Clear() Hàm xoá tất cả các phần tử trong Stack Contains() Hàm xác định sự tồn tại của một phần tử xác định Count Thuộc tính cho biết số lượng phần tử hiện có trong Stack Hàm trả ra phần tử đầu tiên trong Stack, nhưng không xoá Peek() nó khỏi Stack Hàm trả ra phần tử đầu tiên trong Stack và xoá nỏ khỏi Pop() Stack Push() Hàm chèn một phần tử mới vào đầu Stack Lê Viết Mẫn - lvman@hce.edu.vn 47 Mảng Monday, September 9, 13
  48. Ví dụ string exp = "1 2 + 4 * 3 +"; string[] items = exp.Split(); // tách từng số và toán tử ra Stack stack = new Stack (); int num, left, right; foreach (string item in items) { if (int.TryParse(item, out num)) // thử đổi sang số stack.Push(num); // nếu được thì gán vào Stack else { // không được thì là toán tử right = stack.Pop(); // nên lấy ra hai số trong Stack left = stack.Pop(); // dựa theo toán tử để thực hiện phép toán switch (item) { case "+": num = left + right; break; case "-": num = left - right; break; case "*": num = left * right; break; case "/": num = left / right; break; } stack.Push(num); // kết quả được nhét vào lại Stack để tính tiếp } } num = stack.Pop(); // lấy kết quả ra khỏi Stack Console.Write(num); // in kết quả Lê Viết Mẫn - lvman@hce.edu.vn 48 Mảng Monday, September 9, 13
  49. Queue Clear() Hàm xoá tất cả các phần tử trong Stack Contains() Hàm xác định sự tồn tại của một phần tử xác định Count Thuộc tính cho biết số lượng phần tử hiện có trong Stack Hàm trả ra phần tử đầu tiên trong Queue và xoá nó khỏi Dequeue() Queue Enqueue() Hàm này thêm phần tử mới vào cuối Queue Lê Viết Mẫn - lvman@hce.edu.vn 49 Mảng Monday, September 9, 13
  50. Cảm ơn sự chú ý Câu hỏi ? Lê Viết Mẫn - lvman@hce.edu.vn 50 Mảng Monday, September 9, 13