Collections & Generics trong C#

20 966 10
Collections & Generics trong C#

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Collections & Generics Kiểu tập hợp và kiểu tổng quát Tại sao lại có kiểu tập hợp  Giả sử ta cần nhập 1 danh sách sinh viên để xử lí  Nếu biết trước số sinh viên, ta có thể tạo 1 mảng để chứa danh sách này  Nếu chưa biết trước số sinh viên, ta có thể tạo 1 mảng đủ lớn rồi giới hạn số sinh viên được nhập  Hai cách trên có vẻ hợp lí, nhưng nếu ta muốn nhập thêm 1 sinh viên khi mảng đã đầy thì không thể làm được  Từ đó nảy sinh yêu cầu phải có 1 kiểu dữ liệu nào đó có số phần tử thay đổi được, đó chính là kiểu tập hợp (Collections) Kiểu Collection  .NET cung cấp một số class để giải quyết sự giới hạn phần tử của mảng, đó là các lớp collection. Các lớp này được thiết kế để có số phần tử thay đổi được, nó cung cấp các phương thức để chèn và xóa phần tử trong nó  Có 2 loại kiểu tập hợp:  Kiểu tập hợp không tổng quát (nằm trong các namespace System.Collections, System.Collections.Specialized)  Kiểu tập hợp tổng quát (nằm trong namespace System.Collections.Generics) Kiểu tập hợp không tổng quát  Khi nền tảng .NET mới ra đời, các lập trình viên thường dùng các kiểu tập hợp không tổng quát, nằm trong namespace System.Collections (sau này từ phiên bản .NET 2.0, các kiểu tập hợp này đều được tổng quát hóa và nằm trong namespace System.Collections.Generics)  Các phần tử trong kiểu tập hợp không tổng quát đều có kiểu là object Namespace System.Collections Interface Ý nghĩa ICollection Định nghĩa các thông số tổng quát của bất kì tập hợp không tổng quát nào ICloneable Cho phép đối tượng trả về 1 đối tượng là bản sao của nó IDictionary Cho phép đối tượng nongeneric biểu diễn nội dun của nó bằng cặp key-value IEnumerable Cho phép trả về 1 đối tượng hiện thực giao diện IEnumerator IEnumerator Cho phép từ khóa foreach duyệt các phần tử của nó IList Cho phép thêm, xóa, truy cập phần tử thông qua chỉ số của nó trong dãy Namespace System.Collections Class Interface hỗ trợ (không kể ICollection) Ý nghĩa ArrayList IList, IEnumerable, ICloneable Giống như Array nhưng số phần tử của nó có thể tăng lên nếu cần Hashtable IDictionary, IEnumerable, ICloneable Tập hợp các cặp giá trị key-value, truy cập value theo key Queue IEnumerable, ICloneable Tập hợp các đối tượng theo kiểu hàng đợi (_rst-in _rst-out, FIFO) SortedList IDictionary, IEnumerable, ICloneable Tập hợp các cặp giá trị key-value, được sắp xếp thứ tự theo key, có thể truy xuất theo key hoặc theo value Stack IEnumerable, ICloneable Tập hợp các đối tượng theo kiểu ngăn xếp (last-in _rst-out LIFO), có các phương thức push và pop Ví dụ về ArrayList ArrayList AL = new ArrayList(); AL.Add(“Hello”); AL.Add(“World”); AL.Add(“!”); foreach(string s in AL) { Console.WriteLine(“{0} ”, s); } // Output // Hello World ! Các vấn đề của kiểu tập hợp không tổng quát  Vấn đề về hiệu năng: Khi bạn cần thao tác với các dữ liệu số (hoặc value type), chương trình phải tốn thêm bộ nhớ để chuyển kiểu value sang kiểu reference lưu trữ trên heap, khi chuyển lại về kiểu value, ta lại tốn them bộ nhớ để lưu nó trên stack. Những điều trên ảnh hưởng rất lớn đến hiệu năng của chương trình  Vấn đề về an toàn kiểu: Vì kiểu dữ liệu của tập hợp không tổng quát là object nên nó có thể chứa bất kì đối tượng nào. Khi ta tạo 1 danh sách những chiếc xe, ta phải đảm bảo rằng ta chỉ thêm các đối tượng xe vào trong danh sách, nếu ta thêm các đối tượng khác, việc biên dịch vẫn thành công nhưng sẽ gây lỗi lúc chạy Cái nhìn đầu tiên về kiểu tổng quát List<Car> carList = new List<Car>(); carList.Add(new Car(“Red”)); carList.Add(new Car(“Green”)); List<int> intList = new List<int>(); intList.Add(1); // Lệnh sau sẽ gây lỗi // intList.Add(new Car(“Red”)); Kiểu dữ liệu trừu tượng public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { public void Add(T item); public int BinarySearch(T item); public bool Contains(T item); public bool Remove(T item); public T[] ToArray(); } [...]... phép trả về 1 đối tượng hiện thực giao diện IEnumerator IEnumerator Cho phép từ khóa foreach duyệt các phần tử của nó IList Cho phép thêm, xóa, truy cập phần tử thông qua chỉ số của nó trong dãy Namespace System .Collections. Generic Class Interface hỗ trợ Ý nghĩa List IList, IEnumerable, Giống ArrayList ICollection Dictionary IDictionary, IEnumerable Giống Hashtable Queue... public void Add(int item); public int BinarySearch(int item); Kiểu dữ liệu trừu tượng public bool Contains(int item); public bool Remove(int item); public int[] ToArray(); }  Kiểu dữ liệu cũng dùng trong các thành viên generic: Array.Sort(intList); Array.Sort(carList);  Kiểu dữ liệu trừu tượng Giao diện generic public interface IComparable { int CompareTo(T obj); } Interface Ý nghĩa... IEnumerable, ICollection Giống Stack SortedDictionary ICollection, IDictionary, Giống Dictionary + các phần tử được sắp IEnumerable xếp Namespace System .Collections. Generic  Khởi tạo đối tượng collection Cú pháp khởi tạo đối tượng này chỉ áp dụng cho các class có phương thức Add List intList = new List { 1, 2, 4, 5 }; ArrayList myList = new... collection, ta phải sử dụng từ khóa new int[] arr = { 0, 1, 3, 7 };  List:   Một vài class generic collection Add(T): thêm 1 phần tử vào cuối danh sách Remove(T): xóa 1 phần tử xuất hiện đầu tiên trong danh sách  Queue:    Dequeue(): trả về phần tử đầu tiên của hàng đợi và xóa nó Enqueue(T): thêm phần tử vào cuối hàng đợi Peek(): lấy phần tử đầu tiên của hàng đợi nhưng không xóa nó  Stack:... void ResetData() { X = Y = default(T); } Mã giới hạn where T : struct Kiểu T là kiểu reference where T : new() generic Kiểu T là kiểu value (struct, int, double…) where T : class Giới hạn kiểu dữ liệu trong Ý nghĩa Kiểu T phải có hàm khởi tạo mặc định (không tham số) where T : tên class Kiểu T phải kế thừa (trực tiếp hoặc gián tiếp) từ class chỉ định where T : tên interface Kiểu T phải hiện thực giao . IEnumerable<T>, ICollection<T> Giống ArrayList Dictionary <TKey, TValue> IDictionary<TKey, TValue>, IEnumerable<T> Giống Hashtable Queue<T> IEnumerable<T>,. Queue LinkedList<T> IEnumerable<T>, ICollection<T> Danh sách móc nối 2 chiều Stack<T> IEnumerable<T>, ICollection Giống Stack SortedDictionary <TKey, TValue> ICollection<T>,. tượng public class List<int> : IList<int>, ICollection<int>, IList, ICollection, IReadOnlyList<int>, IReadOnlyCollection<int>, IEnumerable<int>, IEnumerable {

Ngày đăng: 18/04/2014, 16:25

Từ khóa liên quan

Mục lục

  • Slide 1

  • Tại sao lại có kiểu tập hợp

  • Kiểu Collection

  • Kiểu tập hợp không tổng quát

  • Namespace System.Collections

  • Namespace System.Collections

  • Ví dụ về ArrayList

  • Các vấn đề của kiểu tập hợp không tổng quát

  • Cái nhìn đầu tiên về kiểu tổng quát

  • Kiểu dữ liệu trừu tượng

  • Kiểu dữ liệu trừu tượng

  • Kiểu dữ liệu trừu tượng

  • Namespace System.Collections.Generic

  • Namespace System.Collections.Generic

  • Khởi tạo đối tượng collection

  • Một vài class generic collection

  • Tự tạo phương thức generic

  • Tự tạo class hoặc struct generic

  • Từ khóa default

  • Giới hạn kiểu dữ liệu trong generic

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

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

Tài liệu liên quan