Bài 8 - Collection Generics - Nền tảng lập trình ứng dụng với C#
-
Upload
hoc-lap-trinh-web -
Category
Documents
-
view
4.658 -
download
10
description
Transcript of Bài 8 - Collection Generics - Nền tảng lập trình ứng dụng với C#
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Bài 8: Collection và Generics
• Collections• Th tá ới á đối t d h á h t ầ t• Thao tác với các đối tượng danh sách tuần tự• Dictionaries• Các collection chuyên biệt hóa (Specialized
Collections)• GenericGeneric• Generic Collections
2
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• 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ể ?Cần dùng collection nào trong từng trường hợp cụ thể ?
3
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections• Các kiểu collection thông dụng− ArrayList
− SortedList
− Queue
− Stack
− HashtableHashtable
− StringCollection
− StringDictionary
4
StringDictionary
− ListDictionary
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• 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
− ArrayList cung cấp 2 phương thức để thêm phần tử:• Add• AddRange
5
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• Thêm phần tử :− Thêm phần tử dùng phương thức AddThêm phần tử dùng phương thức Add
string s=“Hello”;ArrayList coll=new ArrayList(); X
coll
collstring s= Hello ;coll.Add(s);coll.Add(“Hi”);
ll Add( 0)
“Hello”
“Hi”
50
0
1
2
Nhiều kiểu dữ liệu khác
coll.Add(50);coll.Add(new object());
50
object
2
3
6
Nhiều kiểu dữ liệu khác nhau có thể được lưu
trong ArrayList
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• Thêm phần tử− ArrayList hỗ trợ phương thức : AddRange để thêm 1ArrayList hỗ trợ phương thức : AddRange để thêm 1
dãy các phần tử• Từ một array/ collection khác. Add và AddRange
thêm phần tử vào
ArrayList coll=new ArrayList();string[] anArray=new string[]{“more”,”or”,”less”};
pcuối dãy.
coll.AddRange(anArray);object[] anotherArray=new object[]{new object(),new
ArrayList()};
7
y ()};coll.AddRange(anArray);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• 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 địnhArrayList coll = new ArrayList();coll.Insert(1, "Hey all");string[] moreString = new string[] {"good night","see you"};
ll I tR (3 St i ) Kết quảcoll.InsertRange(3, moreString);for (int i = 0; i < coll.Count; i++){
Console.WriteLine("Item " + i + " : " + coll[i]);
Kết quả là gì ?
8
Console.WriteLine( Item i : coll[i]);}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• 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ượngcoll[3]=“du lieu”;
• Chỉ gán giá trị/ ghi đè giá trị cũ• Không thêm mới phần tửg p
9
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• Xóa phần tử− ArrayList hỗ trợ các phương thức xóa phần tử khỏiArrayList hỗ trợ các phương thức xóa phần tử khỏi
collection• Remove• RemoveAt• RemoveRange
10
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• Xóa phần tử// ó hầ tử dù R// xóa phần tử dùng Removecoll.Add(“du lieu”);coll.Remove(“du lieu”);
Remove
coll.Remove( du lieu );// xóa phần tử dùng RemoveAtcoll.RemoveAt(0);// ó hầ tử dù R R
RemoveAt
// xóa phần tử dùng RemoveRangecoll.RemoveRange(0,4);RemoveRange
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collectionsỗ ầ• Phương thức hỗ trợ thêm/ xóa phần tử
− Clear
− IndexOf
− Containsstring myString=“My String”;if (coll.Contains(myString)){
int index=coll IndexOf(myString);int index=coll.IndexOf(myString);coll.RemoveAt(index);
}
12
elsecoll.Clear();
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• Duyệt các phần tử− ArrayList hỗ trợ nhiều cách duyệt các phần tử trongArrayList hỗ trợ nhiều cách duyệt các phần tử trong
collection• Dùng chỉ mục phần tử (index)• Dùng interface IEnumerable và Enumerator• Dùng cấu trúc foreach
13
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections• D ệt á hầ tử• Duyệt các phần tử
for (int i=0;i<coll.Count;i++){Chỉ mụcConsole.WriteLine(coll[i]);
}IEnumerator e=coll.GetEnumerator();
blIEnumerator e coll.GetEnumerator();while(e.MoveNext()){
Console.WriteLine(e.Current);
IEnumerable
}foreach (object item in coll){
Console WriteLine(item);foreach
14
Console.WriteLine(item);}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Collections
• 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 địnhcoll.Sort(new CaseInsentitiveComparer());
15
( p ());
• Có thể tự tạo Comparer nếu có nhu cầu
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Danh sách tuần tự− Là một collectionLà 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ử
16
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Queue• Stack• Stack
17
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự• QueueQ− 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
ố− Một số thuộc tính và phương thức quan trọng• Thuộc tính
–– CountCount–– CountCount
• Phương thức–– EnQueueEnQueue
18
–– DeQueueDeQueue–– PeekPeek
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Thêm/ xóa phần tửQ Q () X
qQueue q=new Queue();
q.EnQueue(“Item 1”);
X
Item 1
q
q
q.EnQueue(“Item 2”);q.EnQueue(“Item 3”);Console.WriteLine(q.DeQueue());
Item 2
Item 3q
Console.WriteLine(q.DeQueue());Item 1
Item 2
19
Item 2
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Tìm phần tử− Duyệt QueueDuyệt Queue
− Dùng DeQueue lấy ra và so sánh phần tử không còn trong Queueg
− Tìm phần tử mà không lấy nó ra khỏi Queue: dùng phương thức Peek
if (q.Peek() is String){Console.WriteLine(q.DeQueue());
20
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự• Stack− 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áchy p
− Một số thuộc tính và phương thức quan trọng• Thuộc tính
–– CountCount• Phương thức
–– PopPop
21
–– PushPush–– PeekPeek
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Thêm/ xóa phần tửSt k St k() X
sStack s=new Stack();
s.Push(“Item 1”);
X
Item 1
s
s
s.Push(“Item 2”);
s.Push(“Item 3”);Console.WriteLine(s.Pop());
C l W it Li ( P ())
Item 2Item 3
Console.WriteLine(s.Pop());
Item 2
Item 3
22
Item 3
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Danh sách tuần tự
• Tìm phần tử− Duyệt StackDuyệt Stack
− Dùng Pop lấy ra và so sánh phần tử không còn trong Stack
− Tìm phần tử mà không lấy nó ra khỏi Stack: dùng phương thức Peek
if (s.Peek() is String){Console.WriteLine(s.Pop());
23
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries
• Tập hợp lưu các phần tử có thứ tự theo từng cặp key/ valueặp y
• Cho phép tìm kiếm phần tử theo key
24
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries
• HashTable• SortedList• SortedList• ListDictionary• HybirdDictionary• OrderedDictionaryy
25
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries• HashTable• HashTable− Lớp Dictionary được dùng để
• á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(“[email protected]”,”Bishop, Scott”);emailLookup[“[email protected]”]=“Bishop, Scott”;
26
emailLookup[ [email protected] ] Bishop, Scott ;
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries• HashTable− 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[“[email protected]”]=“Bishop, Scott”;emailLookup[“[email protected]”]=“Hess, Christian”;emailLookup[“djump@contoso com”]=“Jump Dan”;
System.Collections.DictionaryEntrySystem.Collections.DictionaryEntrySystem.Collections.DictionaryEntry
emailLookup[ [email protected] ]= Jump, Dan ;foreach (object name in emailLookup){
Console.WriteLine(name);
27
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries
• HashTable− Nguyên nhân:Nguyên nhân:
• Chỉ duyệt các đối tượng bên trong Dictionary• Không duyệt trực tiếp key/ valueg yệ ự p y
foreach (DictionaryEntry entry in emailLookup){Console.WriteLine(entry.Name);//Console.WriteLine(entry.Value);
}
28
− DictionaryEnrty chứa key và value
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries• HashTable− 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
H ht bl h H ht bl ()Số hash của “First” =ố h h ủ “Fi t”Hashtable h=new Hashtable();
h[“First”]=“1st”;h[“First”]=“First”;
số hash của “First”chỉ là 1 phần tử
29
h[ First ] First ;Console.WriteLine(“So phần tu: “+h.Count);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionarieskey1 và key 2 là 2
• Hashtablepublic class Fish{ Hastable h=new HashTable();
key1 và key 2 là 2object khác nhau sốhash khác nhau
p {string name;public Fish(string _name){
();Fish key1=new Fish(“Herring”);Fish key2=new Fish(“Herring”);
name=_name;}
}
h[key1]=“Hello”;h[key2]=“Hello”C l W it Li (“S h t} Console.WriteLine(“So phan tu:
“+h.Count);
So phan tu: 2
30
p
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries
• Hashtablepublic override int GetHashCode(){ public override bool Equals(object p (){
return name.GetHashCode();}
p q ( jobj){Fish otherFish=obj as Fish;if (otherFish==null)if (otherFish null)
return false;return otherFish.name==name;
• 2 thể hiện của Fish có cùng số hash
• HashTable xem chúng là }HashTable xem chúng là cùng 1 đối tượng?− Không: 2 đối tượng là 2 thể
hiện khác nhau
2 thể hiện có cùng sốhash, HashTable xemchúng là cùng 1 đối
31
chúng là cùng 1 đốitượng
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries• SortedListSortedList− Là một lớp từ điển
− Có nhiều điểm giống với 1 danh sách thông thường− Có nhiều điểm giống với 1 danh sách thông thườngSortedList s=new SortedList();s[“First”]=“1st”;s[“Second”]=“2nd”;s[“Third”]=“3rd”;s[“Fourth”]=“4th”;s[ Fourth ]= 4th ;s[“fourth”]=“4th”;foreach (DictionaryEntry e in s){
32
Console.WriteLine(“{0}= {1}”,e.Key,e.Value);}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Dictionaries
• SortedList− SortedList hỗ trợ thêm 1 số thuộc tính và phương thứcSortedList hỗ trợ thêm 1 số thuộc tính và phương thức
truy xuất key/ value thông qua index.
− Là lớp được sắp xếp: index của mỗi phần tử có thể ổ ầ
p p p pthay đổ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());…
33
…
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries
• 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 h ê biệtchuyên biệt:− ListDictionary
H bi dDi i− HybirdDictionary
− OrderdDictionary
34
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries
• ListDictionary− HashTable là một tập hợp hiệu quảHashTable là một tập hợp hiệu quả
− Một số khuyết điểm của HashTable• Cần nhiều tài nguyênCầ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ỏ
35
• Hiệu quả cho tập hợp nhỏ• Có cùng interface với HashTable
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries
• ListDictionaryListDictionary emailLookup=new ListDictionary();y p y();emailLookup[“[email protected]”]=“Bishop, Scott”;emailLookup[“[email protected]”]=“Hess, Christian”;
ilL k [“dj @ t ”] “J D ”emailLookup[“[email protected]”]=“Jump, Dan”;foreach (DictionaryEntry entry in emailLookup){
Console.WriteLine(entry.Value);}
36
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries• HybirdDictionaryHybirdDictionary− Có cùng interface với HashTable
Đ dù khi khô biết õ ố hầ tử ủ tậ h− Đượ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ênTự độ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[ [email protected] ]= Bishop, Scott ;emailLookup[“[email protected]”]=“Hess, Christian”;emailLookup[“[email protected]”]=“Jump, Dan”;
37
foreach (DictionaryEntry entry in emailLookup){Console.WriteLine(entry.Value); }
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries
• 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 ?
− Với HashTable:• Không truy xuất phần tử qua index• Gặp giới hạn khi duyệt với enumerator
− OrderedDictionary được dùng khi:• Xây dựng từ điển truy xuất nhanh
ầ
38
• Quản lý các phần tử một cách có thứ tự
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Specialized Dictionaries
• OrderedDictionary− Chức năng tương tự HashTableChức năng tương tự HashTable
− 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
–– ItemItem
• Phương thức–– InsertInsert–– RemoveAtRemoveAt
39
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• 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 S C ll i S i li d hứ á ậ h hỗ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
40
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitArray• BitVector32• BitVector32• StringCollection• StringDictionary• NameValueCollection
41
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa• 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ư• And• Or• Not• Xor
42
Xor
− Không hỗ trợ phương thức Add/ Remove
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitArray− Khi khởi tạo: giá trị mặc định các phần tử là falseKhi 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 p p g y gkích thước
43
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitVector32− Thích hợp cho việc xử lý các bit của một số lớnThí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ô thể th đổi kí h th ớ− Không thể thay đổi kích thước• Kích thước cố định : 32 bit
44
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• 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 y32 bit.
45
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitVector32 - Bit Mask− Tạo thể hiện BitVector32 BitVector32 v=new BitVector32(0);Tạo thể hiện BitVector32
− 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 )
46
int foBit=BitVector32.CreateMask(tBit);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitVector32 - Bit Packing− Hỗ trợ gộp nhiều số nhỏ thành 1 số lớn:Hỗ trợ gộp nhiều số nhỏ thành 1 số lớn:
• Thường được dùng để giảm bộ nhớ lưu trữ khi xử lý các số nhỏ (rất nhỏ).
− Ví dụ : cần lưu 3 số nguyên• Số thứ nhất: max=10
ốCần 3 số
ê I t16Dùng 1
BitV t 32?• Số thứ hai: max=50• Số thứ ba: max=500
nguyên Int16 BitVector32?
47
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• BitVector32 - Bit Packing
BitVector32.Section fs = BitVector32.CreateSection(10);
BitVector32.Section ss = BitVector32 CreateSection(50 fs);
− Tạo section lưu số nguyên có kích thước xác định
BitVector32.CreateSection(50,fs);BitVector32.Section ts =
BitVector32.CreateSection(500,ss);BitVector32 pb = new BitVector32(0);thước xác định
− Gán giá trị cho các section
pb[fs] = 10;pb[ss] = 1;pb[ts] = 192;
− In kết quả Console.WriteLine(pb[fs]);Console.WriteLine(pb[ss]);Console.WriteLine(pb[ts]);
48
(p [ ]);Console.WriteLine(pb.Data);Console.WriteLine(pb);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• CollectionString− Là một tập hợp độngLà một tập hợp động
− Chỉ lưu chuỗi ký tự
− Các chức năng tương tự như ArrayList− Các chức năng tương tự như ArrayListStringCollection coll=new StringCollection();coll.Add(“First”);coll.Add(“Second”);coll.Add(“Third”);String third=coll[2]; ?
49
g [ ];coll.Add(5);
?
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• StringDictionary− Là một phiên bản từ điển mạnhLà một phiên bản từ điển mạnh
− Sử dụng tương tự như HashTable• Key/value đều có kiểu StringKey/value đều có kiểu String
StringDictionary dict=new StringDictionary();dict[“First”]=“1st”;
dict[“Second”]=“2nd”;dict[“second”]=“second”;string second=dict[“Second”]; // 2nd
50
g [ ];
dict[4]=“4th”;?
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• NameValueCollection− Tương tự StringDictionaryTương tự StringDictionary
• Key/ value đều có kiểu String
− Đặc điểm:Đặc điểm:• Cho phép có nhiều value cho 1 key• Truy xuất value thông qua chỉ mục và key
− Thêm phần tử: phương thức Add
− Truy xuất phần tử: phương thức GetValues
51
y p p g
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• NameValueCollectionNameValueCollection nv=new NameValueCollection();nv.Add(“Key”,”Some Text”);nv.Add(“Key”,”More Text”);foreach (string s in nv.GetValues(“Key”)){( g ( y )){
Console.WriteLine(s);}
52
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• NameValueCollectionNameValueCollection nv = new NameValueCollection();();nv["First"]= "1st";nv["First"]= "First";nv.Add("Second", "2nd");nv.Add("Second", "Second");Console WriteLine("First length:"+nv GetValues("First") Length);Console.WriteLine( First length: +nv.GetValues( First ).Length);Console.WriteLine("Second length:"+nv.GetValues("Second").Length);
53
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các Collection chuyên biệt hóa
• NameValueCollectionNameValueCollection nv = new 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]);Console.WriteLine(nv[i]);}
54
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• Khái niệm• Các khai báo Generic• Các khai báo Generic
55
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• 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.
ấ ề− .NET Framework cung cấp nhiều generic class trong namespace System.Collections.Generic• Hoạt động như những lớp khácHoạt động như những lớp khác• Tăng khả năng hiển thị và type-safety
56
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• Các khai báo Generic− Tạo kiểu Generic
Kiểu T và U sẽ được xác định khi sử dụngTạo kiểu Generic
class Obj{public Object t;
class Gen<T,U>{public T t;public Object t;
public Object u;public Obj(Object _t,Object _u){
public T t;public U u;public Gen(T _t,U _u){
t=_t;u=_u;
}
t=_t;u=_u;
}Kiểu thông
thườngKiểu generic
57
}}
}}
thường
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• Các khai báo Generic− Sử dụng kiểu GenericSử dụng kiểu Generic
• Chỉ định kiểu của kiểu generic sử dụng
Obj oa=new Obj(“Hello”,”World!”); Obj oa=new Obj(10.125,1000);j j( , );Console.WriteLine((string)oa.t+
(string)oa.u);Gen<string,string> ga=new
j j( , );Console.WriteLine((double)oa.t+
(int)oa.u);Gen<double,double> ga=newGen string,string ga new
Gen<string,string>(“Hello”,”world!”);
Console.WriteLine(ga.t+ga.u);
Gen double,double ga new Gen<double,int> (10.125,1000);
Console.WriteLine(ga.t+ga.u);
58
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• Các khai báo GenericG <i t i t>Gen<int,int> gc=new
Gen<int,int>(10.125,1000);Console.WriteLine(ga.t+ga.u);
Compile ERROR
Obj oa=new Obj(10.125,1000);Console.WriteLine((int)oa.t+ Runtime
ERROR(int)oa.u); ERROR
59
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic
• 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
cả các kiểu dữ liệu• Giới hạn tương tự lớp Object
Giải há kh i bá á à b ộ i đị h á kiể− Giải pháp: khai báo các ràng buộc, qui định các kiểu có thể dùng với generic.
− Các ràng buộc mà generic hỗ trợg ộ g ợ• Interface• Base class
60
• Constructor• Reference/ value type
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic• Các khai báo Generic• Các khai báo Generic
class CompGen<T> where T : IComparable{public T t1;
CompGen<int> a = new CompGen<int>(10, 20);
public T t2;public CompGen(T _t1,T _t2){
t1=_t1;t2=_t2;
Console.WriteLine(a.Max());
}public T Max(){
if (t2.CompareTo(t1)<0)ể
(t Co pa e o(t ) 0)return t1;
return t2;}
Compile error : kiểu generic T không định nghĩa phương thức CompareTo
61
}}
CompareTo
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• Khái niệm• Giới thiệu các lớp Generic• Giới thiệu các lớp Generic
62
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• Giới thiệu các lớp Generic− List<>
− Queue<>
− Stack<>Stack<>
− Dictionary<>
− SortedList<>SortedList<>
− SortedDictionary<>
− LinkedList<>
64
− LinkedList<>
− NameValuePair<>
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• List<>− 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áchp• Truy xuất phần tử qua chỉ mục• Dùng cấu trúc foreach duyệt danh sách
65
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• List<>List<int> intList=new List<int>();List<int> intList=new List<int>();intList.Add(1);intList.Add(2);intList.Add(3);int number=intList[0];foreach (int i in intList){foreach (int i in intList){
Console.WriteLine(intList[i]);}
66
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• Queue<>− 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();
67
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections
• 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();
68
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• Di ti• Dictionary<>− Có nhiều điểm tương đồng với HashTable,
ListDictionary và HybirdDictionaryListDictionary 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>();dict[3]=“Three”;dict[4]=“Four”;dict[2]=“Two”;dict[1]=“One”;string str=dict[3];
69
string str=dict[3];Console.WriteLine(str);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• Di ti• Dictionary<>− Duyệt các phần tử: dùng foreach với kiểu
KeyValuePair<>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);
}}
70
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• S t dLi t• SortedList<>− Tương tự như Dictionary<>
− Các phần tử được sắp xếp theo tứ tự của keySortedList<string,int> sortList=new SortedList<string,int>();sortList[“Three”]=3;sortList[ Three ]=3;sortList[“One”]=1;sortList[“Two”]=2;foreach(KeyValuePair<string,int> i in sortList){
Console.WriteLine(i);}
71
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• S t dDi ti• SortedDictionary<>− Tương tự như Dictionary<>
− Các phần tử được sắp xếp theo tứ tự của keySortedDictionary<string,int> sortDict=new SortedDictionary<string,int>();sortDict[“Three”]=3;sortDict[ Three ]=3;sortDict[“One”]=1;sortDict[“Two”]=2;foreach(KeyValuePair<string,int> i in sortDict){
Console.WriteLine(i);}
72
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• Li k dLi t• LinkedList<>− 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ợpnó mà không cần truy xuất đến tập hợp
− Chứa tập hợp các đối tượng LinkedListNode• Mỗi LinkedListNode là 1 phần tử của LinkedList• Mỗi LinkedListNode là 1 phần tử của LinkedList
73
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Generic Collections• Li k dLi t
Generic Collections• Li k dLi t li k• LinkedList<>• LinkedList<>
X
links
FirstLinkedList<String> links=new LinkedList<String>();
LastSecond
ThirdLinkedListNode<String>
first=links.AddLast(“First”);LinkedListNode<String>
last=links.AddFirst(“Last”);
Third
ast s dd st( ast );LinkedListNode<String>
second=links.AddBefore(last,”Second”);
li k AddAft ( d ”Thi d”)foreach (string s in links){
Console.WriteLine(s);
links.AddAfter(second,”Third”);
74
}