(+84) 236.3827111 ex. 402

Các danh sách collection xây dựng sẵn trong C#


C# cung cấp các lớp collection trong không gian tên System.Collections hay System.Collections.Generic, là các cấu trúc lưu trữ dữ liệu khác nhau.

ArrayList và List

ArrayList là lớp thuộc không gian tên System.Collections, trong khi List thuộc không gian tên System.Collections.Generic. ArrayList và List đều cho phép tạo một dãy thứ tự các phần tử có kiểu dữ liệu bất kỳ, các phần tử này có thể có giá trị trùng nhau. Khác với mảng, ArrayList và List có thể tự động thay đổi kích thước nếu cần thiết. Các phương thức, thuộc tính trên ArrayList tương tự List.

- Khởi tạo một đối tượng kiểu ArrayList hay List:

ArrayList list = new ArrayList();

List<KiểuDữLiệu> list = new List<KiểuDữLiệu>();

- Truy cập phần tử thứ i: list[i] với chỉ số i bắt đầu từ 0

- int Add(object value): bổ sung phần tử value, trả về vị trí phần tử thêm vào

- void Insert(int index, object value): chèn một phần tử value tại vị trí index

- void RemoveAt(int index): xóa phần tử tại vị trí index

- void Remove(object value): xóa phần tử value trong ArrayList

- void RemoveRange(int index, int count): xóa một dãy count phần tử kể từ vị trí index

- void Clear(): xóa tất cả các phần tử trong ArrayList

- bool Contains(object value): kiểm tra phần tử có trong ArrayList, nếu có trả về true

- void Sort(): sắp xếp các phần tử trong ArrayList

- int IndexOf(object value), int IndexOf(object value, int startIndex),

int IndexOf(object value, int startIndex, int count):

trả về chỉ số của phần tử value trong count phần tử của ArrayList, kể từ vị trí startIndex, nếu không tìm thấy trả về -1

- int BinarySearch(object value): tìm kiếm nhị phân trong danh sách đã sắp xếp

int BinarySearch(int startIndex, int count, object value)

- int Count: trả về số phần tử có trong ArrayList hay List

- int Capacity: thiết lập hay trả về số phần tử có thể chứa trong ArrayList

- bool IsFixedSize: trả về giá trị chỉ rõ ArrayList có kích thước cố định hay không

Ví dụ:

using System;

using System.Collections;

class ViDu

{

static void Main()

{

ArrayList list = new ArrayList();

list.Add(3);

list.Add(2);

list.Insert(1, 6);

list.Remove(3);

for (int i = 0; i < list.Count; i++)

Console.WriteLine(list[i].ToString());

}

}

Hashtable

Hashtable là lớp thuộc không gian tên System.Collections, biểu diễn một bảng băm, là danh sách các cặp phần tử và khóa liên kết phần tử này.

- Khởi tạo đối tượng Hashtable:

Hashtable h = new Hashtable();

- Truy cập phần tử thứ key: h[key]

- void Add(object key, object value): thêm một cặp phần tử value, khóa key vào Hashtable, mỗi phần tử tương ứng với khóa

- bool ContainsKey(object key) hay bool Contains(object key): kiểm tra khóa key có trong Hashtable chưa, nếu có phương thức trả về true

- bool ContainsValue(object value): kiểm tra phần tử có trong Hashtable chưa, nếu có phương thức trả về true

- void Remove(object key): xóa cặp khóa và phần tử tương ứng trong Hashtable

- ICollection Keys: trả về một ICollection chứa các khóa trong Hashtable

- ICollection Values: trả về một ICollection chứa các giá trị trong Hashtable

Ví dụ:

using System;

using System.Collections;

class ViDu

{

static void Main()

{

Hashtable weeks = new Hashtable();

weeks.Add("1", "Sunday");

weeks.Add("2", "Monday");

weeks.Add("3", "Tuesday");

Console.WriteLine(weeks["2"].ToString());

if (weeks.ContainsValue("Tuesday"))

Console.WriteLine( ("Tim thay");

else Console.WriteLine( ("Khong tim thay");

weeks.Remove("3");

foreach (DictionaryEntry day in weeks)

Console.WriteLine( (day.Key + " - " + day.Value);

}

}

SortedList và SortedList

SortedList là lớp thuộc không gian tên System.Collections, trong khi SortedList thuộc không gian tên System.Collections.Generic. SortedList và SortedList biểu diễn một danh sách các cặp phần tử và khóa kết hợp phần tử này tương tự Hashtable, nhưng danh sách SortedList được sắp xếp theo khóa.

Mỗi cặp phần tử và khóa trong SortedList có kiểu struct KeyValuePair<TKey, TValue>, chứa thuộc tính Key trả về khóa và Value trả về giá trị của phần tử.

- Khởi tạo một đối tượng kiểu SortedList hay SortedList:

SortedList list = new SortedList();

SortedList<TKey, TValue> list = new SortedList<TKey, TValue>();

- Truy cập phần tử thứ key: list[key]

- void Add(object key, object value): bổ sung phần tử value với khóa key

- void RemoveAt(int index): xóa phần tử tại vị trí index

- bool Remove(object key): xóa phần tử với khóa key

- int IndexOfValue(object value): tìm giá trị value, trả về vị trí tìm thấy, nếu không tìm thấy trả về -1

- int IndexOfKey(object key): tìm khóa key, trả về vị trí tìm thấy, nếu không tìm thấy trả về -1

- bool ContainsKey(object key): kiểm tra danh sách có chứa khóa key không, nếu có trả về true

- bool ContainsValue(object value): kiểm tra danh sách có chứa giá trị value không, nếu có trả về true

- bool TryGetValue(object key, out object value): trả về giá trị kết hợp với khóa key trong biến value, nếu tìm thấy trả về true

Ví dụ:

using System;

using System.Collections.Generic;

class Program

{

static void Main(string[] args)

{

SortedList sorted = new SortedList();

sorted.Add("Hoa", 9);

sorted.Add("Xuan", 7);

sorted.Add("Dong", 8);

bool contain1 = sorted.ContainsKey("Xuan");

Console.WriteLine("Danh sach co Xuan: " + contain1);

int value;

if (sorted.TryGetValue("Dong", out value))

Console.WriteLine("Gia tri co khoa Dong la " + value);

foreach (var pair in sorted)

Console.WriteLine(pair.Key +"-"+pair.Value);

int index = sorted.IndexOfValue(8);

Console.WriteLine("Vi tri cua diem 8: " + index);

}

}

Dictionary

Dictionary là lớp thuộc không gian tên System.Collections.Generic, biểu diễn một danh sách các cặp phần tử và khóa liên kết với phần tử này tương tự Hashtable. Kiểu dữ liệu của key và value có thể là bất kỳ kiểu cơ sở, string, mảng, kiểu liệt kê, hay struct. Mỗi cặp phần tử và khóa trong Dictionary có kiểu struct KeyValuePair<TKey, TValue>, chứa thuộc tính Key trả về khóa và Value trả về giá trị của phần tử.

- Khởi tạo đối tượng Dictionary

Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();

- Truy cập phần tử thứ key: dict[key]

- void Add(object key, object value): thêm một cặp phần tử value, khóa key vào Dictionary, mỗi phần tử tương ứng với khóa

- bool ContainsKey(object key): kiểm tra khóa có trong Dictionary chưa, nếu có phương thức trả về true

- bool ContainsValue(object value): kiểm tra phần tử có trong Dictionary chưa, nếu có phương thức trả về true

- bool Remove(object key): xóa cặp khóa và phần tử tương ứng, trả về true nếu tồn tại cặp khóa và phần tử, ngược lại trả về false

Ví dụ:

using System;

using System.Collections.Generic;

class ViDu

{

static void Main()

{

Dictionary colorStrings = new Dictionary();

colorStrings.Add(Color.Blue, Color.Blue.ToString());

colorStrings.Add(Color.Red, Color.Red.ToString());

foreach (KeyValuePair color in colorStrings)

Console.WriteLine(color.Key.GetBrightness().ToString()+ " " +

color.Value);

}

}

NameValueCollection

NameValueCollection là lớp thuộc không gian tên System.Collections.Specialized, biểu diễn một danh sách các cặp chuỗi và tên liên kết với chuỗi này tương tự Hashtable. Các chuỗi có thể truy cập bởi tên hay chỉ số. NameValueCollection có thể lưu nhiều chuỗi kết hợp với một tên.

- Khởi tạo đối tượng NameValueCollection:

NameValueCollection pair = new NameValueCollection();

- Truy cập phần tử với tên: pair[name]

hay truy cập phần tử thứ index: pair[index]

- void Add(string name, string value): thêm một cặp chuỗi value và tên name vào NameValueCollection

- void Remove(string name): xóa chuỗi tương ứng tên name

- string[] GetValues(int index): trả về một mảng các chuỗi tại vị trí index

- string Get(int index): trả về chuỗi chứa danh sách các chuỗi tại vị trí index cách nhau dấu phẩy

- string GetKey(int index): trả về tên liên kết với chuỗi tại vị trí index

- string[] AllKeys: trả về mảng tất cả các khóa trong danh sách

Ví dụ:

using System;

using System.Collections.Specialized;

class ViDu

{

static void Main()

{

NameValueCollection markStatus = new NameValueCollection();

markStatus.Add("High", "80");

markStatus.Add("High", "60");

markStatus.Add("Pass", "40");

foreach (string key in markStatus.Keys)

{

string[] values = markStatus.GetValues(key);

foreach (string value in values)

Console.WriteLine (key + " - " + value);

}

}

}

Stack và Stack

Stack là lớp thuộc không gian tên System.Collections, trong khi Stack thuộc không gian tên System.Collections.Generic. Lớp Stack và Stack đều biểu diễn một ngăn xếp hoạt động theo nguyên tắc LIFO (Last In First Out), một phần tử thêm vào ngăn xếp cuối cùng, sẽ được lấy ra đầu tiên.

- Khởi tạo một đối tượng Stack

Stack stack = new Stack();

Stack<KiểuPhầnTử> stack = new Stack<KiểuPhầnTử>();

- void Push(object value): thêm một phần tử vào đỉnh ngăn xếp

- object Pop(): lấy một phần tử từ đỉnh ngăn xếp

- bool Contains(object value): kiểm tra giá trị có trong ngăn xếp không, nếu có trả về true

- object Peek(): trả về một phần tử ở đỉnh của ngăn xếp mà không xóa nó

Ví dụ:

using System;

using System.Collections.Generic;

class ViDu

{

static void Main()

{

Stack days = new Stack();

days.Push("Sunday");

days.Push("Monday");

days.Push("Tuesday");

days.Push("Wednesday");

days.Push("Thursday");

days.Push("Friday");

days.Push("Saturday");

if (days.Count == 7)

Console.WriteLine(days.Pop().ToString());

else Console.WriteLine("Saturday does not exist");

}

}

Queue và Queue

Queue là lớp thuộc không gian tên System.Collections, trong khi Queue thuộc không gian tên System.Collections.Generic. Lớp Queue và Queue đều biểu diễn một hàng đợi hoạt động theo nguyên tắc FIFO (First In First Out), một phần tử thêm vào hàng đợi đầu tiên, sẽ được lấy ra đầu tiên.

- Khởi tạo một đối tượng Queue

Queue<KiểuPhầnTử> queue = new Queue<KiểuPhầnTử>();

- void Enqueue(object value): thêm một phần tử vào cuối hàng đợi

- object Dequeue(object value): lấy một phần tử ở đầu hàng đợi

- object Peek(): trả về phần tử ở đầu hàng đợi

- bool Contains(object value): kiểm tra giá trị có trong hàng đợi không, nếu có trả về true

LinkedList

LinkedList là lớp thuộc không gian tên System.Collections.Generic, biểu diễn một danh sách liên kết đôi, gồm danh sách các node liên kết với nhau bởi thành phần tham chiếu đến node kế tiếp và kế trước của mỗi node.

- Khởi tạo một đối tượng LinkedList

LinkedList<KiểuPhầnTử> list = new LinkedList<KiểuPhầnTử>();

- void AddAfter(LinkedListNode node, int value): chèn node có giá trị value sau node chỉ rõ

- void AddAfter(LinkedListNode node, LinkedListNode newNode): chèn node mới newNode sau node chỉ rõ

- void AddBefore(LinkedListNode node, int value): chèn node có giá trị value trước node chỉ rõ

- void AddBefore(LinkedListNode node, LinkedListNode newNode): chèn node mới newNode trước node chỉ rõ

- void AddFirst(int value): thêm node có giá trị value vào đầu danh sách

- void AddFirst(LinkedListNode node): thêm node chỉ rõ vào đầu danh sách

- void AddLast(int value): thêm node có giá trị value vào cuối danh sách

- void AddLast(LinkedListNode node): thêm node chỉ rõ vào cuối danh sách

- bool Contains(int value): kiểm tra giá trị có trong danh sách không

- LinkedListNode Find(int value): tìm node đầu tiên trong danh sách có giá trị value

- LinkedListNode FindLast(int value): tìm node cuối cùng trong danh sách có giá trị value

- bool Remove(int value): xóa node có giá trị value trong danh sách

- void Remove(LinkedListNode node): xóa node chỉ rõ trong danh sách

- void RemoveFirst(): xóa node đầu tiên trong danh sách

- void RemoveLast(): xóa node cuối cùng trong danh sách

- LinkedListNode Last: trả về node cuối danh sách

- LinkedListNode First: trả về node đầu danh sách

- Mỗi node trong danh sách có kiểu LinkedListNode, có các thuộc tính:

LinkedListNode Next: trả về tham chiếu đến node kế tiếp

LinkedListNode Previous: trả về tham chiếu đến node kế trước

T Value: trả về giá trị của node

Ví dụ:

using System;

using System.Collections.Generic;

class ViDu

{

static void Main()

{

LinkedList list = new LinkedList();

list.AddLast(2);

list.AddFirst(1);

LinkedListNode node = list.First;

while (node != null)

{

Console.WriteLine(node.Value.ToString());

node = node.Next;

}

}

}

HashSet và SortedSet

HashSet là lớp thuộc không gian tên System.Collections.Generic, biểu diễn một tập hợp các phần tử không trùng nhau. .Net 4 bổ sung SortedSet tương tự HashSet, nhưng tập hợp được sắp xếp theo trật tự quy định bởi giao tiếp IComparer.

- Khởi tạo một đối tượng HashSet

HashSet<KiểuPhầnTử> set = new HashSet<KiểuPhầnTử>();

Có thể khởi tạo một HashSet từ một Collection khác

string[] arr = { "cat", "dog", "cat", "leopard", "tiger", "cat" };

HashSet hash = new HashSet(arr);

Có thể khi khởi tạo HashSet, quy định cách thức so sánh phần tử trùng nhau

HashSet hash = new HashSet(new Compare());

Với Compare là lớp cài đặt giao tiếp IEqualityComparer

- bool Add(object item): thêm một phần tử vào HashSet

- bool Remove(object item): xóa phần tử item từ HashSet

- bool Contains(object item): kiểm tra HashSet có chứa giá trị item, nếu có trả về true

- void CopyTo(object[] array): sao chép HashSet đến mảng array

Ví dụ:

using System;

using System.Collections.Generic;

class Program

{

static void Main(string[] args)

{

HashSet hash = new HashSet(new Compare());

hash.Add("1.Hoa");

hash.Add("2.Lan");

hash.Add("3.Thu");

string[] arr = new string[3];

hash.CopyTo(arr);

Console.WriteLine(string.Join(",", arr));

}

}

class Compare : IEqualityComparer

{

public bool Equals(string a, string b)

{

if (GetHashCode(a) == GetHashCode(b))

return true;

return false;

}

public int GetHashCode(string a)

{

return int.Parse(a.Substring(0, a.IndexOf('.') ));

}

}