• Collections tập hợp là các lớp hỗ trợ thu thập và quản lý các đối tượng − Một cách có thứ tự − Hỗ trợ lưu, tìm kiếm và duyệt các đối tượng trong tập hợp • Namespace System.Collections
Trang 3• Collections (tập hợp) là các lớp hỗ trợ thu thập và
quản lý các đối tượng
− Một cách có thứ tự
− Hỗ trợ lưu, tìm kiếm và duyệt các đối tượng trong tập hợp
• Namespace System.Collections của NET Framework
cung cấp nhiều kiểu tập hợp khác nhau
− Cần dùng collection nào trong từng trường hợp cụ thể ?
Trang 4• Các kiểu collection thông dụng
Trang 5• Thêm và xóa phần tử
− Lớp ArrayList là lớp cơ bản nhất nằm ẩn bên trong tấtLớp ArrayList là lớp cơ bản nhất, nằm ẩn bên trong tất
cả các lớp còn lại
− Thêm và xóa phần tử khỏi ArrayList rất đơn giản.p y g
• Add
• AddRange
Trang 6Nhiều kiểu dữ liệu khác
coll Add (50);
coll Add (new object());
50 object
2 3
Nhiều kiểu dữ liệu khác nhau có thể được lưu trong ArrayList
Trang 7coll AddRange (anArray);
object[] anotherArray=new object[]{new object(),new
ArrayList()}; y ()};
coll AddRange (anArray);
Trang 8• Thêm phần tử
− ArrayList cung cấp phương thức Insert và InsertRangeArrayList cung cấp phương thức Insert và InsertRange
hỗ trợ thêm phần tử vào 1 vị trí xác định
ArrayList coll = new ArrayList();
coll Insert ( 1 , "Hey all");
string[] moreString = new string[] {"good night","see you"};
coll InsertRange ( 3 , moreString);
for (int i = 0; i < coll.Count; i++){
Trang 9• Thêm phần tử
− ArrayList hỗ trợ gán giá trị cho đối tượng trongArrayList hỗ trợ gán giá trị cho đối tượng trong
collection thông qua index của đối tượng
coll[3]=“du lieu”;
• Chỉ gán giá trị/ ghi đè giá trị cũ
• Không thêm mới phần tử g p
Trang 11• Xóa phần tử
// ó hầ tử dù R // xóa phần tử dùng Remove coll.Add(“du lieu”);
coll Remove (“du lieu”);
Remove
coll Remove ( du lieu );
// xóa phần tử dùng RemoveAt coll RemoveAt (0);
// ó hầ tử dù R R
RemoveAt
// xóa phần tử dùng RemoveRange coll RemoveRange (0,4);
RemoveRange
Trang 14Console WriteLine(item);
foreach
Console.WriteLine(item);
}
Trang 15• Sắp xếp phần tử
− ArrayList hỗ trợ phương thức Sort để sắp xếp cácArrayList hỗ trợ phương thức Sort để sắp xếp các
phần tử trong collection
coll Sort ();
• Phương thức Sort dùng lớp Comparer thực hiện so sánh
• Comparer thực thi interface IComparer
• Phương thức Sort cho phép chỉ định đối tượng IComparer thay cho đối tượng mặc định
coll Sort ( ( new CaseInsentitiveComparer p ()); ());
• Có thể tự tạo Comparer nếu có nhu cầu
Trang 16• Danh sách tuần tự
− Là một collection
− Chỉ cho phép truy xuất tuần tự từng phần tử
− Mỗi lần chỉ truy xuất 1 phần tử
− Mỗi lần chỉ truy xuất 1 phần tử
Trang 17• Queue
Trang 18• Queue Q
− Là danh sách tuần tự hỗ trợ truy xuất phần tử tuần tự
theo mô hình first-in, first-out (FIFO)
• Thêm phần tử vào cuối danh sách
• Lấy phần tử đầu ra khỏi danh sách
Trang 19q q
Trang 21− Là danh sách tuần tự hỗ trợ truy xuất phần tử theo mô hình last in first out (LIFO)
hình last-in, first-out (LIFO)
• Thêm phẩn tử vào cuối danh sách
• Lấy phần tử cuối ra khỏi danh sách y p
− Một số thuộc tính và phương thức quan trọng
• Thuộc tính
–– Count Count
• Phương thức
–– Pop Pop –– Push Push –– Peek Peek
Trang 22s s
Trang 24• Tập hợp lưu các phần tử có thứ tự theo từng
cặp key/ value ặp y
Trang 26• HashTable
• ánh xạ(map) một key vào 1 value
• ánh xạ(map) một key vào 1 value
• tạo lookup-table map một key duy nhất với 1 value duy nhất
− Lớp HashTable dùng cách trên để lưu trữ các cặp key/ value
HashTable emailLookup=new HashTable();
emailLookup.Add(“sbishop@contoso.com”,”Bishop, Scott”);
emailLookup[“sbishop@contoso.com”]=“Bishop, Scott”;
emailLookup[ sbishop@contoso.com ] Bishop, Scott ;
Trang 27− Từ điển được dùng để tìm kiếm các cặp key/valueÆ
ầduyệt các phần tử sẽ không trực quan
HashTable emailLookup=new HashTable();
System Collections DictionaryEntry
emailLookup[“sbishop@contoso.com”]=“Bishop, Scott”;
emailLookup[“chess@contoso.com”]=“Hess, Christian”;
emailLookup[“djump@contoso com”]=“Jump Dan”;
System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry
emailLookup[ djump@contoso.com ]= Jump, Dan ;
foreach (object name in emailLookup){
Console.WriteLine(name);
}
Trang 28• HashTable
• Chỉ duyệt các đối tượng bên trong Dictionary
• Không duyệt trực tiếp key/ value g yệ ự p y
foreach (DictionaryEntry entry in emailLookup){
Trang 29− Lớp HashTable sử dụng 1 số nguyên (gọi là hash) hỗ
trợ việc lưu trữ các key
• HashTable sử dụng số hash để tăng tốc quá trình tìm kiếm
1 key trong collection y g
• HashTable cho phép có 1 giá trị hash duy nhất làm key, các value có thể trùng nhau
Trang 30key1 và key 2 là 2
public class Fish{ Hastable h=new HashTable();
key1 và key 2 là 2 object khác nhauÆsố hash khác nhau
string name;
public Fish(string _name){
();
Fish key1=new Fish(“Herring”);
Fish key2=new Fish(“Herring”);
Trang 32• SortedList
− Là một lớp từ điển
SortedList s=new SortedList();
Trang 33thay đổi khi thêm/ xóa phần tử.
− Có thể chỉ định IComparer khi tạo SortedList để điều
khiển cách thức sắp xếp của danh sáchkhiển cách thức sắp xếp của danh sách
SortedList s=new SortedList(new DescendingComparer());
…
…
Trang 34• Khi các từ điển chuẩn (standard dictionary) giới hạn
về chức năng/ thể hiện, NET hỗ trợ 3 loại từ điển
Trang 35• ListDictionary
• Cần nhiều tài nguyên
• Gặp trở ngại về thể hiện với những tập hợp nhỏ (<10 phần tử)
− ListDictionary:
• Hoạt động như một mảng đơn giản
• Hiệ ả h tậ h hỏ
• Hiệu quả cho tập hợp nhỏ
• Có cùng interface với HashTable
Trang 37− Có cùng interface với HashTable
− Được dùng khi không biết rõ số phần tử của tập hợp
• HybirdDictionary thực thi như một ListDictionary
• Tự động chuyển thành HashTable khi số phần tử tăng lên Tự động chuyển thành HashTable khi số phần tử tăng lên quá nhiều (1 cách ngầm định)
HybirdDictionary emailLookup=new HybirdDictionary();
emailLookup[“sbishop@contoso com”]=“Bishop Scott”;
emailLookup[“chess@contoso.com”]=“Hess, Christian”;
emailLookup[“djump@contoso.com”]=“Jump, Dan”;
foreach (DictionaryEntry entry in emailLookup){
Trang 38• OrderedDictionary
− Nếu cần chức năng của HashTable và quản lý thứ tựNếu cần chức năng của HashTable và quản lý thứ tự
của các phần tử trong tập hợp ?
• Không truy xuất phần tử qua index
• Gặp giới hạn khi duyệt với enumerator
• Xây dựng từ điển truy xuất nhanh
ầ
• Quản lý các phần tử một cách có thứ tự
Trang 39• OrderedDictionary
− Bổ sung thêm 1 số phương thức và thuộc tính hỗ trợ
truy xuất phần tử qua chỉ mụcy p q
• Thuộc tính
–– Item Item
• Phương thức
–– Insert Insert –– RemoveAt RemoveAt
Trang 40• Các tập hợp đã trình bày ở trên đều cho phép lưu trữ
phần tử có kiểu dữ liệu bất kỳ
− Cần ép kiểu khi truy xuất các phần tử
• .NET cung cấp namespace
System.Collections.Specialized chứa các tập hợp hỗ
trợ xử lý các kiểu dữ liệu xác định
Trang 42• BitArray
− Là tập hợp có thể thay đổi kích thước
• Phải khai báo kích thước ban đầu
• Không tự động thay đổi kích thước
− Hỗ trợ các thao tác cơ bản trên dữ liệu bit như
Trang 43• BitArray
− Khi khởi tạo: giá trị mặc định các phần tử là false
− Chức năng mạnh nhất của BitArray là thực hiện các
phép toán trên bit với 2 đối tượng BitArray có cùng
kích thước
Trang 44• BitVector32
− Thích hợp cho việc xử lý các bit của một số lớn
• Dữ liệu dược lưu dưới dạng số nguyên 32 bit
• Mọi xử lý trên BitVector32 sẽ thay đổi giá trị của số ọ ý y g ị nguyên chứa trong nó
• Lấy giá trị số nguyên thông qua thuộc tính Data
− Không thể thay đổi kích thước
• Kích thước cố định : 32 bit
Trang 45• BitVector32 - Bit Mask
− Cho phép tạo bit mask theo thứ tự tuần tự thông quaCho phép tạo bit mask theo thứ tự tuần tự thông qua
phương thức tĩnh CreateMask.
− Ví dụ: gán giá trị cho 4 bit đầu tiên của 1 số nguyên g g g y
32 bit
Trang 46• BitVector32 - Bit Mask
− Tạo thể hiện BitVector32 Tạo thể hiện BitVector32 BitVector32 v=new BitVector32(0);
− Tạo mask cho bit đầu
tiên
BitVector32 v new BitVector32(0);
int fBit=BitVector32.CreateMask();
− Tạo bit mask thứ 2 với
tham số là bit mask trước
int cBit=BitVector32.CreateMask(fBit);
trước
− Lặp lại bước trên cho tới
khi tạo xong 4 bit mask
int tBit=BitVector32.CreateMask(cBit);
i f Bi Bi V 32 C M k( Bi ) int foBit=BitVector32.CreateMask(tBit);
Trang 47• BitVector32 - Bit Packing
Trang 49• CollectionString
− Chỉ lưu chuỗi ký tự
StringCollection coll=new StringCollection();
Trang 50• StringDictionary
• Key/value đều có kiểu String
StringDictionary dict=new StringDictionary();
dict[“First”]=“1 st”;
dict[“ Second ”]=“2 nd ”;
dict[“ second ”]=“second”;
string second= g dict[“Second”] [ ] ; // 2 nd
Trang 51• NameValueCollection
− Tương tự StringDictionary
• Key/ value đều có kiểu String
• Cho phép có nhiều value cho 1 key
• Truy xuất value thông qua chỉ mục và key
− Truy xuất phần tử: phương thức GetValuesy p p g
Trang 52• NameValueCollection
NameValueCollection nv=new NameValueCollection();
nv Add (“Key”,”Some Text”);
nv Add (“Key”,”More Text”);
foreach (string s in nv ( g GetValues (“Key”)){ ( y )){
Console.WriteLine(s);
}
Trang 53nv Add ("Second", "Second");
Console WriteLine("First length:"+nv GetValues("First") Length);
Console.WriteLine("Second length:"+nv.GetValues("Second").Length);
Trang 54• NameValueCollection
nv Add (“First", “1st");
nv Add ("Second", "2nd");
nv Add ("Second", "Second");
for (int i=0;i<nv.Count;i++){
Console WriteLine(nv[i]);
}
Trang 55• Khái niệm
Trang 56• Khái niệm
− Generic là 1 phần trong hệ thống kiểu của NETGeneric là 1 phần trong hệ thống kiểu của NET
Framework cho phép định kiểu mà không quan tâm nhiều đến các chi tiết bên trong
Trang 57• Các khai báo Generic
được xác định khi sử dụngTạo kiểu Generic
thường
Trang 58• Các khai báo Generic
• Chỉ định kiểu của kiểu generic sử dụng
Obj oa=new Obj(“Hello”,”World!”); j j( , ); Obj oa=new Obj(10.125,1000);
Trang 59• Các khai báo Generic
Obj oa=new Obj(10.125,1000);
Console.WriteLine((int)oa.t+ Runtime
ERROR
Trang 60• Các khai báo Generic
− Generic cũng có giới hạn khi ta xây dựng lớp hỗ trợ tấtGeneric cũng có giới hạn khi ta xây dựng lớp hỗ trợ tất
Trang 61class CompGen<T> where T : IComparable{
return t2;
}
Compile error : kiểu generic T không định nghĩa phương thức CompareTo
}
}
CompareTo
Trang 62• Khái niệm
Trang 63• Khái niệm
Trang 64• Giới thiệu các lớp Generic
Trang 65− Tạo danh sách có thứ tự với kiểu dữ liệu xác địnhạ ự ệ ị
− Khi tạo List, ta có thể:
• Thêm phần tử vào danh sách p
• Truy xuất phần tử qua chỉ mục
• Dùng cấu trúc foreach duyệt danh sách
Trang 66foreach (int i in intList){
foreach (int i in intList){
Console.WriteLine(intList[i]);
}
Trang 67− Là phiên bản type-safety của Queuep yp y Q
• Chỉ định kiểu dữ liệu khi khởi tạo
• EnQueue: thêm phần tử với kiểu dữ liệu của Queue
• DeQueue: lấy phần tử có kiểu của Queue
Queue<String> q=new Queue<String>();
E Q (“H ll ”)
q.EnQueue(“Hello”);
String qString=q.DeQueue();
Trang 68• Stack<>
− Là phiên bản type-safety của Stackp yp y
• Chỉ định kiểu dữ liệu khi khởi tạo
• Push: thêm phần tử với kiểu dữ liệu của Stack
• Pop: lấy phần tử có kiểu của Stack
Stack<String> s=new Stack<String>();
P h(“H ll ”)
s.Push(“Hello”);
String sString=s.Pop();
Trang 69− Có nhiều điểm tương đồng với HashTable,ListDictionary và HybirdDictionary
− Không giống với List<>, Queue<> và Stack<>,Dictionary<> lưu 1 cặp key/ value trong tập hợp.y ặp y g ập ợp
• Khai báo 2 tham số generic khi khởi tạo
Dictionary<int,string> dict=new Dictionary<int,string>();
Trang 70• Di ti
• Dictionary<>
− Duyệt các phần tử: dùng foreach với kiểu
KeyValuePair<>
• KeyValuePair<> nhận 2 tham số như của Dictionary<>
foreach (KeyValuePair<int,string> i int dict){
Console.Write(“{0}= {1}”,i.Key,i.Value);
}}
Trang 71− Tương tự như Dictionary<>
SortedList<string,int> sortList=new SortedList<string,int>();
Trang 72• S t dDi ti
• SortedDictionary<>
− Tương tự như Dictionary<>
SortedDictionary<string,int> sortDict=new SortedDictionary<string,int>();
Trang 73− Là kiểu tập hợp mới của NET
− Là tập các phần tử, các phần tử có liên kết với nhau
− Với mỗi phần tử, có thể truy xuất phần tử trước và sau
nó mà không cần truy xuất đến tập hợp
• Mỗi LinkedListNode là 1 phần tử của LinkedList
• Mỗi LinkedListNode là 1 phần tử của LinkedList
Trang 75Thanks