Bởi: phamvanviet truonglapvy (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() 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ý 1/7
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"; 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(); 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. cũng có thể được tạo thông qua hàm dựng củ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ự. 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: Thành viên Empty Compare() Giải thích Các thành viên của lớp String Biến thành viên tĩnh đại diện cho một chuỗi rỗng 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() Copy() Equals() Format() Intern() Phương thức tĩnh, tạo một chuỗi mới từ nhiều chuỗi Phương thức tĩnh, tạo một bản sao Phương thức tĩnh, so sánh hai chuỗi có giống nhau Phương thức tĩnh, định dạng chuỗi bằng các định dạng đặc tả Phương thức tĩnh, nhận về một tham chiếu đến chuỗi 2/7
IsInterned() Join() Chars Length Clone() CompareTo() CopyTo() EndsWith() Equals() Insert() LastIndexOf() PadLeft() PadRight() Remove() Split() StartsWith() SubString() ToCharArray() ToLower() ToUpper() Trim() TrimEnd() TrimStart() Phương thức tĩnh, nhận về một tham chiếu đến chuỗi đã tồn tại Phương thức tĩnh, ghép nối nhiều chuỗi, mềm dẻo hơn Concat() Indexer của chuỗi Chiều dài chuỗi (số ký tự) Trả về một chuỗi So sánh với chuỗi khác Sao chép một lượng ký tự trong chuỗi sang mảng ký tự Xác định chuỗi có kết thúc bằng chuỗi tham số không Xác định hai chuỗi có cùng giá trị Chèn một chuỗi khác vào chuỗi vị trí xuất hiện cuối cùng của một chuỗi con trong chuỗi 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 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 Xóa một số ký tự Cắt một chuỗi thành nhiều chuỗi con Xác định chuỗi có bắt đầu bằng một chuỗi con tham số Lấy một chuỗi con Sao chép các ký tự của chuỗi thành mảng các ký tự Tạo bản sao chuỗi chữ thường Tạo bản sao chuỗi chữ hoa Cắt bỏ các khoảng trắng hai đầu chuỗi Cắt bỏ khoảng trắng cuối chuỗi Cắt bỏ khoảng trắng đầu chuỗi Để biết chi 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 tác chuỗi. 3/7
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" 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' Vị trí trê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 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() /* 1 */ s = "thay the chuoi.".replace('t', 'T'); // s = "Thay The chuoi" /* 2 */ s = "thay the chuoi.".replace("th", "TH"); // s = "THay THe chuoi" 4/7
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 đượ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); Ký tự C c D d Vài định dạng thông dụng Mô tả Ví dụ Kết quả Tiền tệ (Currency) string.format("{0:c}", 2.5);string.Format("{0:C}", -2.5); Decimal string.format("{0:d5}", 25); 00025 $2.50($2.50) 5/7
E e Khoa hoc (Scientific) string.format("{0:e}", 250000); 2.500000E+005 F f Cố định phần thập phân(fixed-point) string.format("{0:f2}", 25);string.Format("{0:F0}", 25); 25.0025 G g N n General string.format("{0:g}", 2.5); 2.5 Số (Number) string.format("{0:n}", 2500000); 2,500,000.00 X x Hệ số 16 (Hexadecimal) string.format("{0:x}", 250);string.Format("{0:X}", 0xffff); FAFFFF 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. Phương thức Capacity Chars Length MaxCapacity Append() AppendFormat() Vài phương thức quan trọng của lớp Giải thích Lấy/thiết đặt số ký tự tối đa chuỗi có thể lưu giữ Indexer Kích thước chuỗi Lấy số ký tự tối đa lớp có thể lưu giữ Thêm một đối tượng vào cuối chuỗi Đị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() Remove() Chèn một đối tượng vào chuỗi tại vị trí Xóa một số ký tự trong chuỗi 6/7
Replace() Thay một ký tự/chuỗi con bằng ký tự/chuỗi con mới 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. 7/7