NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Chương 3: Cấu trúc dữ liệu trong C#
1
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Cấu trúc dữ liệu trong C#
I.
II.
III.
Lập trình tổng quát trong C#
Một số cấu trúc dữ liệu trong C#
Các cấu trúc tập hợp trong C#
2
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Lâp trình tổng qt trong C#
1. Giới thiệu lập trình tổng quát (Generic Programming)
2. Lớp tổng quát (Generic Class)
3. Phương thức tổng quát (Generic Method)
4. Cấu trúc tổng quát (Generic Struct)
3
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Giới thiệu
Tổng qt hóa chương trình để có thể hoạt động với các kiểu dữ liệu khác nhau, kể cả các kiểu dữ liệu trong tương lai
(thuật tốn đã xác định).
Ví dụ, kiểu ngăn xếp
– C: dùng con trỏ void
– C++: dùng template
– Java 1.5: Generics
– C#: Generics
– (generics [C#], vs. C++ templates)
4
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Generic trong .NET 2.0
Type Safety: Các ngôn ngữ .net (C#, C++,...) đều là những ngơn ngữ được định kiểu mạnh, có nghĩa là bạn phải khai báo
biến rõ ràng trước khi sử dụng.
Generic là gì? Generic cho phep chung ta định kiểu an toàn (type safety). Generic cho phep ta tạo ra môt câu truc dữ liêu
mà khơng cần phải xác định đó là kiểu dữ liêu gì. Tuy nhiên khi câu truc dữ liêu này được sử dụng, trình biên dịch phải đảm
bảo răng kiểu dữ liêu được sử dụng với nó là kiểu an toàn. Generic cũng tương đương vơi Template trong C++ tuy nhiên
viêc sử dụng Generic trong .net dê dàng hơn nhiều so với Template.
5
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Ý nghĩa
Lập trình tổng qt cho phép bạn trì hỗn kiểu dữ liệu với các thành phần của lớp hay phương thức cho đến khi nó thực
sự được sử dụng trong chương trình. Nói cách khác, Generics cho phép bạn viết lớp hay phương thức có thể làm việc
với bất kỳ kiểu dữ liệu nào.
Khi trình biên dịch gọi đến constructor hoặc phương thức của lớp, nó sẽ tự động sinh code để xử lý cho kiểu dữ liệu cho
phù hợp.
6
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
using System;
Ví dụ
public T getItem(int index)
{
using System.Collections.Generic;
return array[index];
namespace GenericApplication
}
{
public void setItem(int index, T value)
public class MyGenericArray<T>
{
{
array[index] = value;
private T[] array;
public MyGenericArray(int size)
}
}
{
array = new T[size + 1];
}
7
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Ví dụ
class Tester
{
intArray.setItem(c, c*5);
}
static void Main(string[] args)
//retrieving the values
{
for (int c = 0; c < 5; c++)
//declaring an int array
{
MyGenericArray<int> intArray = new
MyGenericArray<int>(5);
//setting values
Console.Write(intArray.getItem(c) + " ");
}
Console.WriteLine();
for (int c = 0; c < 5; c++)
{
8
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
//declaring a character array
Ví dụ
//retrieving the values
MyGenericArray<char> charArray = new
for (int c = 0; c< 5; c++)
MyGenericArray<char>(5);
{
//setting values
Console.Write(charArray.getItem(c) + " ");
for (int c = 0; c < 5; c++)
}
{
Console.WriteLine();
charArray.setItem(c, (char)(c+97));
Console.ReadKey();
}
}
//retrieving the values
}
}
9
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Features of Generics
Using generics is a technique that enriches your programs in the following ways:
It helps you to maximize code reuse, type safety, and performance.
You can create generic collection classes. The .NET Framework class library contains several new generic collection classes in
the System.Collections.Generic namespace. You may use these generic collection classes instead of the collection classes in
the System.Collectionsnamespace.
You can create your own generic interfaces, classes, methods, events and delegates.
You may create generic classes constrained to enable access to methods on particular data types.
You may get information on the types used in a generic data type at run-time by means of reflection.
10
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Generic Class
Generic classes have type parameters. Separate classes, each with a different field type in them, can be
replaced with a single generic class. The generic class introduces a type parameter. This becomes part of the class
definition itself.
11
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Generic Class - Example
class Test<T>
class Program
{
{
T _value;
static void Main()
{
public Test(T t)
// Use the generic type Test with an int type parameter.
{
Test<int> test1 = new Test<int>(5);
// The field has the same type as the parameter.
// Call the Write method.
this._value = t;
test1.Write();
}
// Use the generic type Test with a string type parameter.
public void Write()
Test<string> test2 = new Test<string>("cat");
{
test2.Write();
Console.WriteLine(this._value);
}
}
Bộ môn CNPM – Khoa CNTT.
}
}
12
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Generic methods
In the previous example, we have used a generic class; we can declare a generic method with a type parameter.
A generic method is a template of a method that takes a number of type parameters
Có thể khai báo phương thức tổng quát trong cả lớp non-generic và lớp generic.
13
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
class Program
Generic methods - Example
Console.WriteLine("Char values before calling swap:");
{
Console.WriteLine("c = {0}, d = {1}", c, d);
static void Swap<T>(ref T lhs, ref T rhs)
//call swap
{
Swap<int>(ref a, ref b);
T temp;
Swap<char>(ref c, ref d);
temp = lhs;
//display values after swap:
lhs = rhs;
Console.WriteLine("Int values after calling swap:");
rhs = temp;
Console.WriteLine("a = {0}, b = {1}", a, b);
}
Console.WriteLine("Char values after calling swap:");
static void Main(string[] args)
Console.WriteLine("c = {0}, d = {1}", c, d);
{
Console.ReadKey();
}
int a, b; char c, d; a = 10; b = 20; c = 'I';d = 'V';
//display values before swap:
}
Console.WriteLine("Int values before calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
14
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Generic struct rất giống với generic class.
Cụ thể ta xem xét qua ví dụ sau:
Generic struct
internal class MainClass
{
private static void Main()
internal struct GenericStruct<T>
{
{
GenericStruct<int> IntData = new GenericStruct<int>(10);
private T _Data;
public GenericStruct(T value)
GenericStruct<string> StringData = new
GenericStruct<string>("str");
Console.WriteLine("IntData = {0}", IntData.Data);
{_Data = value;}
Console.WriteLine("StringData = {0}", StringData.Data);
}
public T Data
}
{
get { return _Data; }
set { _Data = value; }
}
}
15
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Constraints
Ràng bc tham sơ
Generic cho ta viết môt lớp mà không cần xác định kiểu dữ liêu cụ thể, nhưng vân cho phep ngươi sử dụng lớp đó chi ra kiểu dữ li êu cụ thể se
sử dụng. Điều này tạo ra sư linh hoạt băng cách thay thế môt sô ràng buôc về kiểu mà có thể được sử dụng trong các tham sô.
public static T Max<T> (T op1, T op2) where T : IComparable
{
if (op1.CompareTo(op2) < 0)
return op1;
return op2;
}
Trong ví dụ đã chi ra ràng buôc mà kiểu được sử dụng cho kiểu tham sô phải thưc thi giao diên IComparable.
16
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Constraints
Cac kiêu răng bc co thê sư dung.
where T : struct – T là câu truc (value type)
where T : class – T là lớp (reference type)
where T : new() - yêu cầu T phải có một constructor khơng tham sơ. Khi có nhiều ràng buộc thì new() phải ở ci cùng.
where T : class_name - tên lớp mà tham sô T phải thừa kế
where T : interface_name – tên giao diên mà tham sơ T phải thưc thi.
Cũng có thể sử dụng kết hợp nhiều răng buôc như where T : IComparable, new().
17
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Constraint
where T: struct
where T : class
where T : new()
where T : <base class name>
where T : <interface name>
where T : U
Constraints
Description
The type argument must be a value type. Any value type except Nullable can be specified. See Using Nullable Types (C# Programming Guide) for
more information.
The type argument must be a reference type, including any class, interface, delegate, or array type.
The type argument must have a public parameterless constructor. When used in conjunction with other constraints, the new() constraint must be
specified last.
The type argument must be or derive from the specified base class.
The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also
be generic.
The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.
18
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Giới thiệu LTTQ
Constraints
class C<S,T>: D
where T: A, ICloneable
where S: B {
...
}
class E<T>: D
where T: class{
...
}
class F<T>: D
where T: struct{
...
}
class G<T>: D
where T: new(){ ...
}
19
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
I.
II.
Stack
queue
20
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
Stack
Stack là một cấu trúc theo kiểu LIFO (Last In First Out), phần tử vào sau cùng sẽ được lấy ra trước.
Hai thao tác cơ bản trên Stack
Chèn phần tử: Luôn chèn vào đỉnh Stack (push)
Lấy ra phần tử: Luôn lấy ra từ đỉnh Stack (pop)
Lớp Stack thuộc namespace System.Collections, biểu diễn ngăn xếp (LIFO) các đối tượng non – generic. Để sử dụng kiểu
generic dùng System.Collections.Generic.Stack<T>.
Lớp Stack hiện thực các giao diện ICollection, IEnumerable, ICloneable.
21
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
Stack - Example
namespace DataStructures
{
class Program
{
static void Main(string[] args)
{
int[] a = { 10, 20, 30 };
Stack s = new Stack(a);
s.Push(1);
s.Push("abccd");
Console.WriteLine(s.Count);
Console.ReadLine();
}
}
}
22
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
Stack – Lưu ý
Capacity là số lượng các phần tử mà stack có thể chứa. Stack có thể chứa các phần tử có kiểu dữ liệu khác nhau. Thuộc tính
Count để chỉ số phần tử hiện trong Stack.
Khi 1 phần tử được thêm vào (Push), capacity tự động tăng, và tổ chức lại bộ nhớ. Nếu Count< Capacity thì Push có số phép toán
là O(1), ngược lại là O(n) (n = Count). Pop có số phép tốn là O(1).
Stack cho phép chèn phần tử null, hoặc các phần tử có giá trị bằng nhau.
23
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
Stack class in C#
Contructor
Tên
Mô tả
Stack()
Khởi tạo Stack trông, capacity ban đầu mặc định.
Stack(ICollection)
Khởi tạo Stack chứa các phần tử copy từ một tập hợp (mảng), capacity ban đầu băng sô phần tử
được copy.
Stack(Int32)
Khởi tạo Stack trông, capacity ban đầu băng giá trị truyền vào. (Dùng Contructor này tôt nhât)
WHY?
24
Bộ môn CNPM – Khoa CNTT.
NGƠN
NGƠN NGỮ
NGỮ LẬP
LẬP TRÌNH
TRÌNH 22
Một số cấu trúc dữ liệu
Stack class in C#
Methods
Tên
Mô tả
Clear
Removes tât cả các đôi tượng trong Stack.
Clone
Tạo bản sao của Stack.
Contains
Xác định xem phần tử có trong Stack.
CopyTo
Copy stack ra mảng 1 chiều, bắt đầu từ vị trí chi định. (Nếu mảng chứa các KDL khác nhau ?)
Peek
Trả về đôi tượng trên đinh Stack không remove nó khỏi stack.
Pop
Remove và trả về đơi tượng trên đinh stack.
Push
Chèn một đôi tượng vào đinh stack
ToArray
Copy stack ra một mảng mới.
25
Bộ môn CNPM – Khoa CNTT.