Chuỗi Gvhd: Nguyễn Tấn Trần Minh Khang
67
Chương 10 Chuỗi
Chuỗi (string) trong C# là một kiểu dựng sẵn như các kiểu
int
,
long
…, có đầy đủ
tính chất mềm dẻo, mạnh mẽ và dễ dùng. Một đối tượng chuỗi trong C# là một hay
nhiều ký tự Unicode không thể thay đổi thứ tự. Nói cách khác là các phương thức
áp dụng lên chuỗi không làm thay đổi bản thân chuỗi, chúng chỉ tạo một bản sao có
sửa đổi, chuỗi gốc vẫn giữ nguyên.
Để khai báo một đối tượng chuỗi, sử dụng từ khóa
string
; đối tượng này thật sự
trùng với đối tượng
System
.
String
trong thư viện lớp .NET Framework. Việc sử
dụng hai đối tượng này là như nhau trong mọi trường hợp.
Khai báo lớp
System.String như sau:
public sealed class String:IComparable,ICloneable,Iconvertible
Khai báo này có nghĩa như sau:
seal - không thể thừa kế từ lớp này
ICompareable - các đối tượng chuỗi có thể được sắp thứ thự
IClonable - có thể tạo một đối tượng B mới y hệt đối tượng A.
IConvertible - có thể chuyển thành các kiểu dựng sẵn khác như
ToInt32(), ToDouble() …
10.1 Tạo chuỗi mới
Cách đơn giản nhất để tạo một biến kiểu chuỗi là khai báo và gán một chuỗi cho nó
string sChuoi = "Khai báo và gán một chuỗi";
Một số ký tự đặc biệt có qui tắc riêng như
"\n"
,
"\\"
hay
"\t"…
đại diện cho ký
tự xuống dòng, dấu xuyệt (\), dấu tab…Ví dụ khai báo
string sDuongDan = "C:\\WinNT\\Temp";
biến sDuongDan sẽ có giá trị C:\WinNT\Temp. C# cung cấp một cách khai báo theo
đúng nguyên gốc chuỗi bằng cách thêm ký tự @. Khai báo
sDuongDan
sẽ như sau
string sDuongDan = @"C:\WinNT\Temp";
10.2 Phương thức ToString()
Đây là phương thức của đối tượng
object
(và của tất cả các đối tượng khác)
thường dùng để chuyển một đối tượng bất kỳ sang kiểu chuỗi.
int myInteger = 5;
string integerString = myInteger.ToString();
Chuỗi
intergerString
có giá trị là "5". Bằng cách này ta cũng có thể tạo một
chuỗi mới. Chuỗi cũng có thể được tạo thông qua hàm dựngcủa lớp
System.String
. Lớp này có hàm dựng nhận vào một mảng các ký tự. Như vậy ta
cũng tạo được chuỗi từ mảng ký tự.
Chuỗi Gvhd: Nguyễn Tấn Trần Minh Khang
68
10.3 Thao tác chuỗi
Lớp chuỗi cung cấp nhiều phương thức cho việc so sánh, tìm kiếm… được liệt kê
trong bảng sau:
Bảng 10-1 Các thành viên lớp string
Thành viên Giải thích
Empty Biến thành viên tĩnh đại diện cho một chuỗi rỗng
Compare() Phương thức tĩnh so sánh hai chuỗi
CompareOrdinal() Phương thức tĩnh, so sánh 2 chuỗi không quan tâm đến ngôn ngữ
Concat() Phương thức tĩnh, tạo một chuỗi mới từ nhiều chuỗi
Copy() Phương thức tĩnh, tạo một bản sao
Equals() Phương thức tĩnh, so sánh hai chuỗi có giống nhau
Format() Phương thức tĩnh, định dạng chuỗi bằng các định dạng đặc tả
Intern() Phương thức tĩnh, nhận về một tham chiếu đến chuỗi
IsInterned() Phương thức tĩnh, nhận về một tham chiếu đến chuỗi đã tồn tại
Join() Phương thức tĩnh, ghép nối nhiều chuỗi, mềm dẻo hơn Concat()
Chars Indexer của chuỗi
Length Chiều dài chuỗi (số ký tự)
Clone() Trả về một chuỗi
CompareTo() So sánh với chuỗi khác
CopyTo() Sao chép một lượng ký tự trong chuỗi sang mảng ký tự
EndsWith() Xác định chuỗi có kết thúc bằng chuỗi tham số không
Equals() Xác định hai chuỗi có cùng giá trị
Insert() Chèn một chuỗi khác vào chuỗi
LastIndexOf() vị trí xuất hiện cuối cùng của một chuỗi con trong chuỗi
PadLeft()
Canh phải các ký tự trong chuỗi, chèn thêm các khoảng trắng bên
trái khi cần
PadRight()
Canh trái các ký tự trong chuỗi, chèn thêm các khoảng trắng bên
phải khi cần
Remove() Xóa một số ký tự
Split() Cắt một chuỗi thành nhiều chuỗi con
StartsWith() Xác định chuỗi có bắt đầu bằng một chuỗi con tham số
SubString() Lấy một chuỗi con
ToCharArray() Sao chép các ký tự của chuỗi thành mảng các ký tự
ToLower() Tạo bản sao chuỗi chữ thường
ToUpper() Tạo bản sao chuỗi chữ hoa
Trim() Cắt bỏ các khoảng trắng hai đầu chuỗi
Chuỗi Gvhd: Nguyễn Tấn Trần Minh Khang
69
Thành viên Giải thích
TrimEnd() Cắt bỏ khoảng trắng cuối chuỗi
TrimStart() Cắt bỏ khoảng trắng đầu chuỗi
Để biết chi tiết các sử dụngcủa các hàm trên, có thể tham thảo tàiliệucủa
Microsoft, đặc biệt là MSDN. Dưới đây chỉ giới thiệu vài phương thức thao dụng để
thao tác chuỗi.
Ghép chuỗi
Để ghép 2 chuỗi ta dùng toán tử
+
string a = "Xin";
string b = "chào";
string c = a + " " + b; // c = "Xin chào"
Chú ý: việc ghép nối bằng toán tử + tuy cho mã nguồn đẹp, tự nhiên
nhưng sẽ không cho hiệu quả tốt khi thực hiện nhiều lần vì C# sẽ cấp
phát vùng nhớ lại sau mỗi phép ghép chuỗi.
Lấy ký tự
Để lấy một ký tự tại một ví trí trên chuỗi ta dùng toán tử []
string s = "Xin chào mọi người";
char c = s[5]; // c = 'h'
Chú ý: vị trí rên chuỗi bắt đầu từ vị trí số 0
Chiều dài chuỗi
Để biết số ký tự của chuỗi, dùng thuộc tính Length
string s = "Xin chào";
int l = s.Length; // l = 8
Chú ý: không cần đóng ngoặc sau property
Lấy chuỗi con
Để lấy chuỗi con của một chuỗi, sử dụng phương thức Substring().
string s;
/* 1 */ s = "Lay chuoi con".Substring(4);// s = "chuoi con"
/* 2 */ s = "Lay chuoi con".Substring(4, 5); // s = "chuoi"
Trong
/*1*/
s
lấy chuỗi con tính từ vị trí thứ 4 trở về sau, còn trong
/*2*/
s
lấy
chuỗi con từ vị trí thứ 4 và lấy chuỗi con có chiều dài là 5.
Thay thế chuỗi con
Để thay thế chuỗi con trong chuỗi bằng một chuỗi con khác, sử dụng phương thức
Replace()
string s;
/* 1 */ s = "thay the chuoi.".Replace('t', 'T');
// s = "Thay The chuoi"
/* 2 */ s = "thay the chuoi.".Replace("th", "TH");
Chuỗi Gvhd: Nguyễn Tấn Trần Minh Khang
70
// s = "THay THe chuoi"
Trong
/*1*/
s
là chuỗi đã thay thế ký tự
't'
thành
'T'
, còn trong
/*2*/
là
chuỗi đã thay thế chuỗi
"th"
thành
"TH".
Định dạng chuỗi
Chuỗi được sử dụng nhiều trong trường hợp kết xuất kết quả ra cho người dùng.
Trong nhiều trường hợp ta không thể có được chính xác chuỗi cần thiết mà phải phụ
thuộc vào một số biến. Vì vậy hàm định dạng chuỗi giúp ta định dạng lại chuỗi
trước khi kết xuất.
double d = tinh_toan_phuc_tap_1();
double e = tinh_toan_phuc_tap_2();
// giả sử d = 2.5, e = 3.5
string s;
s = string.Format("Kết quả là: {0:C} va {1:c} đôla", d, e);
// s = "Kết quả là: $2.5 và $3.5 đôla"
Hàm định dạng chuỗi khá phức tạp vì có nhiều tùy chọn. Cú pháp củ hàm định dạng
tổng quát như sau
string.Format(provider, format, arguments)
provider: nguốn cung cấp định dạng
format: chuỗi cần định dạng chứa thông tin định dạng
arguments
: các thông số cho định dạng
C# tạo sẵn các nguồn định đạng cho kiểu số, kiểu dùng nhiều nhất, vì vậy ta chỉ
quan tâm đến cú pháp rút gọn sau và các thông tin định dạng cho kiểu số.
string.Format (format, arguments);
Hình 10-1 Vài định dạng thông dụng
Ký tự Mô tả Ví dụ Kết quả
C hoặc c Tiền tệ (Currency) string.Format("{0:C}", 2.5);
string.Format("{0:C}", -2.5);
$2.50
($2.50)
D hoặc d Decimal string.Format("{0:D5}", 25); 00025
E hoặc e Khoa hoc (Scientific) string.Format("{0:E}", 250000); 2.500000E+005
F hoặc f Cố định phần thập phân
(Fixed-point)
string.Format("{0:F2}", 25);
string.Format("{0:F0}", 25);
25.00
25
G hoặc g General string.Format("{0:G}", 2.5); 2.5
N hoặc n Số (Number) string.Format("{0:N}", 2500000); 2,500,000.00
X hoặc x
Hệ số 16 (Hexadecimal)
string.Format("{0:X}", 250);
string.Format("{0:X}", 0xffff);
FA
FFFF
10.4 Thao tác chuỗi động
Sau mỗi thao tác lên chuỗi sẽ tạo ra một bản sao chuỗi mới. Vì vậy sử dụng đối
tượng
string
có thể làm giảm hiệu năng hệ thống. Khi đó ta nên sử dụng lớp
StringBuilder (một loại chuỗi khác). Các thao tác lên chuỗi làm thay đổi trên
chính chuỗi. Vài phương thức quan trọng của lớp được liệt kê dưới đây.
Chuỗi Gvhd: Nguyễn Tấn Trần Minh Khang
71
Phương thức Giải thích
Capacity Lấy/thiết đặt số ký tự tối đa chuỗi có thể lưu giữ
Chars Indexer
Length Kích thước chuỗi
MaxCapacity Lấy số ký tự tối đa lớp có thể lưu giữ
Append() Thêm một đối tượng vào cuối chuỗi
AppendFormat() Định dạng chuỗi tham số, sau đó thêm chuỗi này vào cuối
EnsureCapacity() Xác định chuỗi có thể lưu giữ tối thiểu một lượng ký tự không
Insert() Chèn một đối tượng vào chuỗi tại vị trí
Remove() Xóa một số ký tự trong chuỗi
Replace() Thay một ký tự/chuỗi con bằng ký tự/chuỗi con mới
Ví dụ 10-1 Sử dụng StringBuilder
using System;
using System.Text;
namespace Programming_CSharp
{
public class StringTester
{
static void Main( )
{
// một chuỗi bất kỳ để thao tác
string s1 = "One,Two,Three Liberty Associates, Inc.";
// hằng ký tự
const char Space = ' ';
const char Comma = ',';
// mảng các dấu cách
char[] delimiters = new char[]{ Space, Comma };
// dùng StringBuilder để tạo một chuỗi
StringBuilder output = new StringBuilder( );
int ctr = 1;
// tách chuỗi, sau đó ghép lại theo dang mong muốn
// tách chuỗi theo các dấu phân cách trong delimiter
foreach (string subString in s1.Split(delimiters))
{
// chèn một chuỗi sau khi định dạng chuỗi xong
output.AppendFormat("{0}: {1}\n",ctr++,subString);
}
Console.WriteLine(output);
}
}
}
Kết quả:
1: One
2: Two
3: Three
4: Liberty
5: Associates
6:
7: Inc.
. tiết các sử dụng của các hàm trên, có thể tham thảo tài liệu của
Microsoft, đặc biệt là MSDN. Dưới đây chỉ giới thiệu vài phương thức thao dụng để
thao.
Length Kích thước chuỗi
MaxCapacity Lấy số ký tự tối đa l p có thể lưu giữ
Append() Thêm một đối tượng vào cuối chuỗi
AppendFormat() Định dạng chuỗi