Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P8 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.65 MB, 10 trang )

71
Chương 2: Thao tác dữ liệu
|
Ngăn cách các biểu thức có thể so trùng, ví dụ
AAA|ABA|ABB
sẽ so trùng với
AAA
,
ABA
, hoặc
ABB
(các biểu thức được so trùng từ trái sang).
[abc]
So trùng với một trong các ký tự trong nhóm, ví dụ
[AbC]
sẽ so trùng với
A
,
b
, hoặc
C
.
[^abc]
So trùng với bất cứ ký tự nào không thuộc các ký tự trong nhóm, ví dụ
[^AbC]
sẽ không so trùng với
A
,
b
, or
C


nhưng so trùng với
B
,
F
,…
[a-z]
So trùng với bất kỳ ký tự nào thuộc khoảng này, ví dụ
[A-C]
sẽ so trùng với
A
,
B
, hoặc
C
.
( )
Xác định một biểu thức con sao cho nó được xem như một yếu tố đơn lẻ
đối với các yếu tố được trình bày trong bảng này.
?
Xác định có một hoặc không có ký tự hoặc biểu thức con đứng trước nó, ví
dụ
A?B
so trùng với
B
,
AB
, nhưng không so trùng với
AAB
.
*

Xác định không có hoặc có nhiều ký tự hoặc biểu thức con đứng trước nó,
ví dụ
A*B
so trùng với
B
,
AB
,
AAB
,
AAAB
,…
+
Xác định có một hoặc có nhiều ký tự hoặc biểu thức con đứng trước nó, ví
dụ
A+B
so trùng với
AB
,
AAB
,
AAAB
,… nhưng không so trùng với
B
.
{n}
Xác định có đúng
n
ký tự hoặc biểu thức con đứng trước nó, ví dụ
A{2}

chỉ
so trùng với
AA
.
{n,}
Xác định có ít nhất
n
ký tự hoặc biểu thức con đứng trước nó, ví dụ
A{2,}
so trùng với
AA
,
AAA
,
AAAA
,… nhưng không so trùng với
A
.
{n, m}
Xác định có từ
n
đến
m
ký tự đứng trước nó, ví dụ
A{2,4}
so trùng với
AA
,
AAA
, và

AAAA
nhưng không so trùng với
A
hoặc
AAAAA
.
Khi dữ liệu cần kiểm tra càng phức tạp thì cú pháp của biểu thức chính quy cũng càng phức
tạp. Ví dụ, dễ dàng kiểm tra dữ liệu nhập chỉ chứa số hay có chiều dài tối thiểu, nhưng kiểm
tra một URL khá phức tạp. Bảng 2.3 liệt kê một số biểu thức chính quy dùng để kiểm tra các
kiểu dữ liệu thông dụng.
Bảng 2.3
Một số biểu thức chính quy thông dụng
Kiểu dữ liệu nhập Mô tả Biểu thức chính quy
Số
Chỉ chứa các chữ số thập phân; ví dụ
5
, hoặc
5683874674
.
^\d+$
PIN
Chứa 4 chữ số thập phân,
ví dụ
1234
.
^\d{4}$
Mật khẩu đơn giản
Chứa từ 6 đến 8 ký tự; ví dụ
ghtd6f
hoặc

b8c7hogh
.
^\w{6,8}$
Số thẻ tín dụng
Chứa dữ liệu phù hợp với cấu trúc
của hầu hết các loại số thẻ tín dụng,
ví dụ
4921835221552042
hoặc
4921-
8352-2155-2042
.
^\d{4}-?\d{4}-?\d{4}- ?
\d{4}$
72
Chương 2: Thao tác dữ liệu
Địa chỉ e-mail
[\w-]+
nghĩa là chứa một
hoặc nhiều ký tự word
hoặc dấu gạch ngang, ví dụ


^[\w-]+@([\w- ]
+\.)+[\w-]+$
HTTP hoặc HTTPS
URL
Dữ liệu là một URL dựa-trên-HTTP
hay dựa-trên-HTTPS, ví dụ


^https?://([\w- ]
+\.)+[\w-]+(/[\w- ./ ?
%=]*)?$
Một khi đã biết cú pháp của biểu thức chính quy, bạn tạo một đối tượng
System.Text.RegularExpression.Regex
bằng cách truyền cho phương thức khởi dựng của nó
chuỗi chứa biểu thức chính quy. Sau đó, gọi phương thức
IsMatch
của đối tượng
Regex

truyền chuỗi cần kiểm tra, phương thức này trả về một giá trị luận lý cho biết chuỗi có hợp lệ
không. Cú pháp của biểu thức chính quy sẽ chỉ định
Regex
so trùng toàn bộ chuỗi hay chỉ so
trùng một phần của chuỗi (xem
^
,
\A
,
$
, và
\z
trong bảng 2.2)
Phương thức
ValidateInput
dưới đây minh họa cách kiểm tra chuỗi nhập bằng biểu thức
chính quy:
public static bool ValidateInput(string regex, string input) {
// Tạo đối tượng Regex dựa trên biểu thức chính quy.

Regex r = new Regex(regex);
// Kiểm tra dữ liệu nhập có trùng với biểu thức chính quy hay không.
return r.IsMatch(input);
}
Bạn có thể sử dụng đối tượng
Regex
để kiểm tra nhiều chuỗi, nhưng không thể thay đổi biểu
thức chính quy được gắn cho nó; bạn phải tạo một đối tượng
Regex
mới tương ứng với một
cấu trúc mới. Phương thức
ValidateInput
ở trên tạo ra một đối tượng
Regex
mới mỗi lần được
gọi, thay vào đó bạn có thể sử dụng phương thức tĩnh nạp chồng
IsMatch
.
public static bool ValidateInput(string regex, string input) {
// Kiểm tra dữ liệu nhập có trùng với biểu thức chính quy hay không.
return Regex.IsMatch(input, regex);
}
6.
6.
S d ng bi u th c chính quy đã đ c biên d chử ụ ể ứ ượ ị
S d ng bi u th c chính quy đã đ c biên d chử ụ ể ứ ượ ị


Bạn cần giảm thiểu các tác động lên hiệu năng của ứng dụng khi các biểu thức
chính quy phức tạp được sử dụng thường xuyên.

73
Chương 2: Thao tác dữ liệu


Khi khởi tạo đối tượng
System.Text.RegularExpressions.Regex
, hãy truyền thêm
tùy chọn
Compiled
thuộc kiểu liệt kê
System.Text.RegularExpressions.
RegexOptions
để biên dịch biểu thức chính quy thành
Microsoft Intermediate
Language
(
MSIL
).
Theo mặc định, khi bạn tạo đối tượng
Regex
, mẫu biểu thức chính quy do bạn xác định trong
phương thức khởi dựng được biên dịch thành một dạng trung gian (không phải MSIL). Mỗi
lần bạn sử dụng đối tượng
Regex
, bộ thực thi phiên dịch dạng trung gian này và áp dụng nó để
kiểm tra chuỗi. Với các biểu thức chính quy phức tạp được sử dụng thường xuyên, việc phiên
dịch lặp lặp đi lại có thể gây tác động xấu lên hiệu năng của ứng dụng.
Khi tùy chọn
RegexOptions.Compiled
được chỉ định, bộ thực thi sẽ biên dịch biểu thức chính

quy thành MSIL. MSIL này được gọi là mã just-in-time (JIT), được biên dịch thành mã máy
nguyên sinh trong lần thực thi đầu tiên, giống như mã assembly thông thường. Biểu thức
chính quy được biên dịch cũng được sử dụng giống như đối tượng
Regex
, việc biên dịch chỉ
giúp thực thi nhanh hơn.
Tuy nhiên, việc biên dịch biểu thức chính quy cũng có vài nhược điểm. Trước tiên, trình biên
dịch JIT phải làm việc nhiều hơn, dẫn đến chậm quá trình biên dịch, đặc biệt khi tạo biểu thức
chính quy được biên dịch khi ứng dụng khởi động. Thứ hai, biểu thức chính quy được biên
dịch vẫn tồn tại trong bộ nhớ khi không còn được sử dụng nữa, nó không bị bộ thu gom rác
(Garbage Collector) xóa đi như các biểu thức chính quy thông thường. Vùng nhớ bị chiếm chỉ
được giải phóng khi chương trình kết thúc, hoặc khi bạn giải phóng miền ứng dụng.
Dòng mã sau minh họa cách tạo một đối tượng
Regex
được biên dịch thành MSIL:
Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+",
RegexOptions.Compiled);
Ngoài ra, phương thức tĩnh
Regex.CompileToAssembly
cho phép bạn tạo một biểu thức chính
quy được biên dịch và ghi nó vào một assembly khác. Nghĩa là bạn có thể tạo một assembly
chứa các biểu thức chính quy để sử dụng cho nhiều ứng dụng sau này. Để biên dịch một biểu
thức chính quy và lưu nó vào một assembly, thực hiện các bước sau:
1. Tạo một mảng
System.Text.RegularExpressions.RegexCompilationInfo
đủ lớn để
chứa các đối tượng
RegexCompilationInfo
, mỗi đối tượng ứng với một biểu thức chính
quy cần được biên dịch.

2. Tạo một đối tượng
RegexCompilationInfo
cho mỗi biểu thức chính quy và truyền đối số
cho phương thức khởi dựng để xác định các thuộc tính của biểu thức chính quy này.
Các thuộc tính thông dụng là:

IsPublic

giá trị
bool
xác định lớp biểu thức chính quy được tạo ra có tầm vực
là công khai hay không.

Name

một
String
xác định tên của lớp.

Namespace

một
String
xác định không gian tên của lớp.

Pattern

một
String
xác định mẫu mà biểu thức chính quy sẽ so trùng (xem chi

tiết ở mục 2.5).

Options

một giá trị thuộc kiểu liệt kê
System.Text.RegularExpressions.
RegexOptions
xác định các tùy chọn cho biểu thức chính quy.
74
Chương 2: Thao tác dữ liệu
3. Tạo một đối tượng
System.Reflection.AssemblyName
để xác định tên của assembly mà
phương thức
Regex.CompileToAssembly
sẽ tạo ra.
4. Gọi phương thức
Regex.CompileToAssembly
, truyền các đối số là mảng
RegexCompilationInfo
và đối tượng
AssemblyName
.
Quá trình trên tạo ra một assembly chứa các khai báo lớp cho từng biểu thức chính quy được
biên dịch, mỗi lớp dẫn xuất từ
Regex
. Để sử dụng một biểu thức chính quy đã được biên dịch
trong assembly, bạn cần tạo đối tượng biểu thức chính quy này và gọi các phương thức của nó
giống như khi tạo nó với phương thức khởi dựng
Regex

bình thường. Bạn nhớ thêm tham
chiếu tới assembly khi sử dụng các lớp biểu thức chính quy nằm trong nó.
Đoạn mã sau minh họa cách tạo một assembly có tên là MyRegex.dll, chứa hai biểu thức chính
quy có tên là
PinRegex

CreditCardRegex
:
using System.Text.RegularExpressions;
using System.Reflection;
public class CompiledRegexExample {
public static void Main() {
// Tạo mảng chứa các đối tượng RegexCompilationInfo.
RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2];
// Tạo đối tượng RegexCompilationInfo cho PinRegex.
regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$",
RegexOptions.Compiled, "PinRegex", "", true);
// Tạo đối tượng RegexCompilationInfo cho CreditCardRegex.
regexInfo[1] = new RegexCompilationInfo(
@"^\d{4}-?\d{4}-?\d{4}-?\d{4}$",
RegexOptions.Compiled, "CreditCardRegex", "", true);
// Tạo đối tượng AssemblyName để định nghĩa assembly.
AssemblyName assembly = new AssemblyName();
assembly.Name = "MyRegEx";
// Tạo các biểu thức chính quy được biên dịch.
Regex.CompileToAssembly(regexInfo, assembly);
75
Chương 2: Thao tác dữ liệu
}
}

7.
7.
T o ngày và gi t chu iạ ờ ừ ỗ
T o ngày và gi t chu iạ ờ ừ ỗ


Bạn cần tạo một thể hiện
System.DateTime
mô tả giờ, ngày được chỉ định trong
một chuỗi.


Sử dụng phương thức
Parse
hoặc
ParseExact
của lớp
DateTime
.
Có nhiều cách mô tả ngày, giờ; ví dụ 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cùng chỉ
một ngày; 16:43 và 4:43 PM cùng chỉ một giờ. Lớp
DateTime
cung cấp phương thức tĩnh
Parse
rất linh hoạt, cho phép tạo thể hiện
DateTime
từ nhiều cách mô tả khác nhau trong
chuỗi.
Phương thức
Parse

rất mạnh trong việc tạo đối tượng
DateTime
từ một chuỗi cho trước. Nó có
thể xử lý một chuỗi chỉ chứa một phần thông tin hay chứa thông tin sai, và thay thế các giá trị
thiếu bằng các giá trị mặc định. Ngày mặc định là ngày hiện tại, giờ mặc định là 12:00:00
AM. Nếu sau mọi cố gắng,
Parse
không thể tạo đối tượng
DateTime
, nó sẽ ném ngoại lệ
System.FormatException
. Ví dụ sau minh họa tính linh hoạt của
Parse
:
// 01/09/2004 12:00:00 AM
DateTime dt1 = DateTime.Parse("Sep 2004");
// 05/09/2004 02:15:33 PM
DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33");
// 05/09/2004 12:00:00 AM
DateTime dt3 = DateTime.Parse("5,9,04");
// 05/09/2004 02:15:33 PM
DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33");
// 07/10/2004 02:15:00 PM (giả sử ngày hiện tại là 07/10/2004)
DateTime dt5 = DateTime.Parse("2:15 PM");
Phương thức
Parse
linh hoạt và có thể tự sửa lỗi. Tuy nhiên, mức độ linh hoạt này không cần
thiết trong trường hợp bạn muốn bảo đảm các chuỗi phải theo một định dạng nhất định. Khi
đó, sử dụng phương thức
ParseExact

thay cho
Parse
. Dạng đơn giản nhất của
ParseExact
nhận ba đối số: chuỗi chứa ngày giờ, chuỗi định dạng xác định cấu trúc mà chuỗi chứa ngày
giờ phải tuân theo, và một tham chiếu
IFormatProvider
cung cấp thông tin đặc thù về bản địa.
Nếu
IFormatProvider

null
, thông tin về bản địa của tiểu trình (thread) hiện hành sẽ được
sử dụng.
Nếu ngày giờ trong chuỗi đang xét không đúng với định dạng quy định,
ParseExact
sẽ ném
ngoại lệ
System.FormatException
. Chuỗi định dạng được sử dụng tương tự như khi bạn chỉ
76
Chương 2: Thao tác dữ liệu
định chuỗi đại diện cho một đối tượng
DateTime
. Điều này có nghĩa là bạn có thể sử dụng cả
định dạng chuẩn lẫn định dạng tùy biến. Tham khảo phần tài liệu cho lớp
System.Globalization.DateTimeFormatInfo
trong tài liệu .NET Framework SDK để có thông
tin đầy đủ về tất cả các kiểu định dạng.
// Chỉ phân tích các chuỗi chứa LongTimePattern.

DateTime dt6 = DateTime.ParseExact("2:13:30 PM",
"h:mm:ss tt", null);
// Chỉ phân tích các chuỗi chứa RFC1123Pattern.
DateTime dt7 = DateTime.ParseExact(
"Sun, 05 Sep 2004 14:13:30 GMT",
"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", null);
// Chỉ phân tích các chuỗi chứa MonthDayPattern.
DateTime dt8 = DateTime.ParseExact("September 03",
"MMMM dd", null);
8.
8.
C ng, tr , so sánh ngày giộ ừ ờ
C ng, tr , so sánh ngày giộ ừ ờ


Bạn cần thực hiện các phép tính số học cơ bản hay phép so sánh trên ngày, giờ.


Sử dụng các cấu trúc
DateTime

TimeSpan
(hỗ trợ các toán tử số học và so sánh).
Một đối tượng
DateTime
mô tả một thời điểm xác định (chẳng hạn 4:15 AM, ngày 21 tháng 04
năm 1980), trong khi đối tượng
TimeSpan
mô tả một khoảng thời gian (chẳng hạn 2 giờ, 35
phút). Bạn có thể cộng, trừ, so sánh các đối tượng

TimeSpan

DateTime
.
Thực chất, cả
DateTime

TimeSpan
đều sử dụng tick để mô tả thời gian—1 tick bằng 100
nano-giây (một nano-giây bằng một phần tỷ (10
-9
) giây).
TimeSpan
lưu khoảng thời gian của
nó là số tick bằng khoảng thời gian đó,
DateTime
lưu số tick đã trôi qua kể từ 12:00:00 khuya
ngày 1 tháng 1 năm 0001 sau công nguyên. Cách tiếp cận này và việc sử dụng toán tử nạp
chồng giúp
DateTime

TimeSpan
dễ dàng hỗ trợ các phép tính số học và so sánh. Bảng 2.4
tóm tắt các toán tử mà hai cấu trúc này hỗ trợ.
Bảng 2.4
Các toán tử được cung cấp bởi DateTime và TimeSpan
Toán tử TimeSpan DateTime
Gán (
=
)


TimeSpan
là một cấu trúc nên
phép gán trả về một bản sao,
không phải một tham chiếu.

DateTime
là một cấu trúc nên
phép gán trả về một bản sao, không
phải một tham chiếu.
77
Chương 2: Thao tác dữ liệu
Cộng (
+
) Cộng hai đối tượng
TimeSpan
.
Cộng một
TimeSpan
vào một
DateTime
.
Trừ (
-
) Trừ hai đối tượng
TimeSpan
.
Trừ một
DateTime
cho một

DateTime
hoặc một
TimeSpan
.
Bằng (
==
)
So sánh hai đối tượng
TimeSpan

trả về
true
nếu bằng nhau.
So sánh hai đối tượng
DateTime

trả về
true
nếu bằng nhau.
Không bằng
(
!=
)
So sánh hai đối tượng
TimeSpan

trả về
true
nếu không bằng nhau.
So sánh hai đối tượng

DateTime

trả về
true
nếu không bằng nhau.
Lớn hơn (
>
)
Xác định một đối tượng
TimeSpan
có lớn hơn một đối tượng
TimeSpan
khác hay không.
Xác định một đối tượng
DateTime
có lớn hơn một đối tượng
DateTime
khác hay không.
Lớn hoặc bằng
(
>=
)
Xác định một đối tượng
TimeSpan
có lớn hơn hoặc bằng một đối
tượng
TimeSpan
khác hay không.
Xác định một đối tượng
DateTime

có lớn hơn hoặc bằng một đối
tượng
DateTime
khác hay không.
Nhỏ hơn (
<
)
Xác định một đối tượng
TimeSpan
có nhỏ hơn một đối tượng
TimeSpan
khác hay không.
Xác định một đối tượng
DateTime
có nhỏ hơn một đối tượng
DateTime
khác hay không.
Nhỏ hoặc bằng
(
<=
)
Xác định một đối tượng
TimeSpan
có nhỏ hơn hoặc bằng một đối
tượng
TimeSpan
khác hay không.
Xác định một đối tượng
DateTime
có nhỏ hơn hoặc bằng một đối

tượng
DateTime
khác hay không.
Âm (
-
)
Trả về một giá trị đảo dấu của một
TimeSpan
.
Không hỗ trợ.
Dương (
+
) Trả về chính
TimeSpan
.
Không hỗ trợ.
Cấu trúc
DateTime
cũng hiện thực các phương thức
AddTicks
,
AddMilliseconds
,
AddSeconds
,
AddMinutes
,
AddHours
,
AddDays

,
AddMonths
, và
AddYears
. Mỗi phương thức này cho phép bạn
cộng (hoặc trừ bằng các giá trị âm) phần tử thời gian thích hợp với đối tượng
DateTime
. Các
phương thức này và các toán tử được liệt kê trong bảng 2.4 không làm thay đổi
DateTime
gốc
—thay vào đó chúng sẽ tạo một đối tượng mới với giá trị đã được thay đổi. Đoạn mã dưới đây
trình bày cách sử dụng các toán tử để thao tác các cấu trúc
DateTime

TimeSpan
:
// Tạo một TimeSpan mô tả 2.5 ngày.
TimeSpan timespan1 = new TimeSpan(2,12,0,0);
// Tạo một TimeSpan mô tả 4.5 ngày.
TimeSpan timespan2 = new TimeSpan(4,12,0,0);
// Tạo một TimeSpan mô tả 1 tuần.
TimeSpan oneWeek = timespan1 + timespan2;
// Tạo một DateTime với ngày giờ hiện tại.
DateTime now = DateTime.Now;
78
Chương 2: Thao tác dữ liệu
// Tạo một DateTime mô tả 1 tuần trước đây.
DateTime past = now - oneWeek;
// Tạo một DateTime mô tả 1 tuần trong tương lai.

DateTime future = now + oneWeek;
9.
9.
S p x p m t m ng ho c m t ArrayListắ ế ộ ả ặ ộ
S p x p m t m ng ho c m t ArrayListắ ế ộ ả ặ ộ


Bạn cần sắp xếp các phần tử trong một mảng hoặc một
ArrayList
.


Sử dụng phương thức
ArrayList.Sort
để sắp xếp
ArrayList
và phương thức tĩnh
Array.Sort
để sắp xếp mảng.
Dạng đơn giản nhất của
Sort
là sắp xếp các đối tượng nằm trong một mảng hoặc
ArrayList
khi các đối tượng này có hiện thực giao diện
System.Icomparable
và có kiểu giống nhau—tất
cả các kiểu dữ liệu cơ bản đều hiện thực
Icomparable
. Đoạn mã dưới đây minh họa cách sử
dụng phương thức

Sort
:
// Tạo một mảng mới và thêm phần tử vào.
int[] array = {4, 2, 9, 3};
// Sắp xếp mảng.
Array.Sort(array);
// Hiển thị nội dung của mảng đã được sắp xếp.
foreach (int i in array) { Console.WriteLine(i);}
// Tạo một ArrayList mới và thêm phần tử vào.
ArrayList list = new ArrayList(4);
list.Add("Phong");
list.Add("Phuong");
list.Add("Khoa");
list.Add("Tam");
// Sắp xếp ArrayList.
list.Sort();
// Hiển thị nội dung của ArrayList đã được sắp xếp.
foreach (string s in list) { Console.WriteLine(s);}
79
Chương 2: Thao tác dữ liệu
Để sắp xếp các đối tượng không hiện thực
IComparable
, bạn cần truyền cho phương thức
Sort
một đối tượng hiện thực giao diện
System.Collections.IComparer
. Hiện thực của
IComparer
phải có khả năng so sánh các đối tượng nằm trong mảng hoặc
ArrayList

(xem mục 16.3 để
biết cách hiện thực
IComparable

IComparer
).
10.
10.
Chép m t t p h p vào m t m ngộ ậ ợ ộ ả
Chép m t t p h p vào m t m ngộ ậ ợ ộ ả


Bạn cần chép nội dung của một tập hợp vào một mảng.


Sử dụng phương thức
ICollection.CopyTo
(được hiện thực bởi tất cả các lớp tập
hợp), hoặc sử dụng phương thức
ToArray
(được hiện thực bởi các tập hợp
ArrayList
,
Stack
,
Queue
).
Các phương thức
ICollection.CopyTo


ToArray
có cùng chức năng, chúng chép các phần tử
trong một tập hợp vào một mảng. Sự khác biệt nằm ở chỗ
CopyTo
chép vào một mảng đã có,
trong khi
ToArray
tạo ra một mảng mới rồi chép vào đó.
CopyTo
nhận hai đối số: một mảng và một chỉ số. Mảng này là đích của quá trình sao chép và
phải có kiểu tương thích với các phần tử của tập hợp. Nếu kiểu không tương thích hay không
có sự chuyển đổi ngầm từ kiểu phần tử của tập hợp sang kiểu phần tử của mảng thì ngoại lệ
System.InvalidCastException
sẽ bị ném. Chỉ số là một vị trí trong mảng mà bắt đầu từ đó các
phần tử của tập hợp sẽ được chép vào. Nếu chỉ số này lớn hơn hoặc bằng chiều dài của mảng,
hoặc số phần tử của tập hợp vượt quá sức chứa của mảng thì ngoại lệ
System.ArgumentException
sẽ bị ném. Đoạn mã sau minh họa cách sử dụng
CopyTo
để chép
nội dung của một
ArrayList
vào một mảng:
// Tạo một ArrayList mới và thêm phần tử vào.
ArrayList list = new ArrayList(5);
list.Add("Phuong");
list.Add("Phong");
list.Add("Nam");
list.Add("Tam");
list.Add("Nhan");

// Tạo một string[] và sử dụng ICollection.CopyTo
// để chép nội dung của ArrayList.
string[] array1 = new string[5];
list.CopyTo(array1,0);
Các lớp
ArrayList
,
Stack
, và
Queue
cũng hiện thực phương thức
ToArray
, phương thức này tự
động tạo một mảng với kích thước đủ để chứa các phần tử của của tập hợp. Nếu bạn không
truyền đối số cho
ToArray
, nó sẽ trả về một
object[]
bất chấp kiểu của các đối tượng trong
tập hợp. Tuy nhiên, bạn có thể truyền một đối tượng
System.Type
để chỉ định kiểu của mảng
(Bạn phải ép mảng kiểu mạnh về đúng kiểu). Ví dụ sau minh họa cách sử dụng
ToArray
cho
ArrayList
ở trên:
80
Chương 2: Thao tác dữ liệu
// Sử dụng ArrayList.ToArray để tạo một object[]

// từ nội dung của tập hợp.
object[] array2 = list.ToArray();
// Sử dụng ArrayList.ToArray để tạo một string[] kiểu mạnh
// từ nội dung của tập hợp.
string[] array3 =
(string[])list.ToArray(System.Type.GetType("System.String"));
11.
11.
T o m t t p h p ki u m nhạ ộ ậ ợ ể ạ
T o m t t p h p ki u m nhạ ộ ậ ợ ể ạ


Bạn cần tạo một tập hợp chỉ chứa các phần tử thuộc một kiểu nhất định.


Tạo một lớp dẫn xuất từ lớp
System.Collections.CollectionBase
hay
System.Collections.DictionaryBase
, và hiện thực các phương thức an-toàn-về-
kiểu-dữ-liệu (
type-safe
) để thao tác trên tập hợp.
Các lớp
CollectionBase

DictionaryBase
có thể đóng vai trò các lớp cơ sở để dẫn xuất ra
các lớp tập hợp an-toàn-kiểu mà không phải hiện thực lại các giao diện chuẩn:
IDictionary

,
IList
,
ICollection
, và
IEnumerable
.

CollectionBase

dùng cho các tập hợp dựa-trên-
Ilist
(như
ArrayList
). Thực chất,
CollectionBase
duy trì tập hợp bằng một đối tượng
ArrayList
chuẩn, có thể được truy
xuất thông qua thuộc tính bảo vệ
List
.

DictionaryBase

dùng cho các tập hợp dựa-trên-
IDictionary
(như
Hashtable
). Thực

chất,
DictionaryBase
duy trì tập hợp bằng một đối tượng
Hashtable
chuẩn, có thể được
truy xuất thông qua thuộc tính bảo vệ
Dictionary
.
Đoạn mã sau hiện thực một tập hợp tên mạnh (dựa trên lớp
CollectionBase
) để thể hiện một
danh sách các đối tượng
System.Reflection.AssemblyName
.
using System.Reflection;
using System.Collections;
public class AssemblyNameList : CollectionBase {
public int Add(AssemblyName value) {
return this.List.Add(value);
}
public void Remove(AssemblyName value) {

×