Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Thao tác với lớp StringBuilder trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Smile Thao tác với lớp StringBuilder trong lập trình C#

    Lớp StringBuilder giúp bạn thao tác nhanh các chuỗi với ít tổn hao bộ nhớ hơn so với lớp String. Trong bài viết này, mình sẽ trình bày những thao tác cơ bản với lớp StringBuilder, với những thao tác này, bạn có thể "đủ xài" trong các ứng dụng của mình rồi.
    Do StringBuilder là 1 lớp, nên ta cần tạo 1 thể hiện của lớp này bằng 1 trong các cách sau:
    Visual C# Code:
    1. StringBuilder sb = new StringBuilder(); // bộ khởi tạo với chuỗi sb rỗng

    Visual C# Code:
    1. StringBuilder sb = new StringBuilder(int <chiều dài chuỗi>)
    2. //Ví dụ:
    3. StringBuilder sb = new StringBuilder(26); // sb rỗng, có chiều dài là 26

    Visual C# Code:
    1. StringBuilder sb = new StringBuilder(<chuỗi khởi tạo>)
    2. //Ví dụ:
    3. StringBuilder sb = new StringBuilder("Hello world"); // sb = "Hello world"

    Visual C# Code:
    1. StringBuilder sb = new StringBuilder(<chuỗi khởi tạo>,<chiều dài chuỗi>)
    2. //Ví dụ:
    3. StringBuilder sb = new StringBuilder("Hello world",100);
    4. // sb = "Hello world", và nó có chiều dài bằng 100 (trong trường hợp này ta vẫn chưa xài hết dung lượng của nó)

    Còn sau đây là các thao tác cơ bản:
    Syntax Code:
    1. - sb.Insert(<chỉ mục>,"chuỗi") : chèn 1 chuỗi bất kỳ bắt đầu từ chỉ mục trong chuỗi sb
    2. - sb.Remove(<chỉ mục bắt đầu>,<số ký tự cần xóa>)
    3. - sb.Replace(<chuỗi con cần thay thế>,<chuỗi con mới>)

    Ví dụ:
    Visual C# Code:
    1. StringBuilder sb = new StringBuilder("Con kien bo tren lung con bo");
    2. sb.Insert(12,"nhanh ");
    3. //Con kien bo nhanh tren lung con bo
    4. sb.Remove(23,5);
    5. //Con kien bo nhanh tren con bo
    6. sb.Replace("con bo","con trau");
    7. //Con kien bo nhanh tren con trau
    8. sb.AppendFormat(" voi van toc {0} m/s",1);
    9. //Con kien bo nhanh tren con trau voi van toc 1 m/s

    Bây giờ, nếu bạn muốn thêm một dấu phẩy sau từ "kien", trước tiên bạn phải tìm ra vị trí của từ này rồi mới chèn dấu phẩy sau từ này. Hàm IndexOf() rất tiện lợi để làm việc này, nhưng rất tiếc là StringBuilder không có hàm IndexOf(). Bạn phải chọn giải pháp là sử dụng ToString() để lấy một bản sao của chuỗi từ StringBuilder, rồi sử dụng IndexOf() để tìm ra vị trí của từ "kien" rồi sau đó sử dụng phương thức Insert() của StringBuilder để chèn dấu phẩy nơi bạn muốn trên chuỗi nguyên thủy. Một khi xong, bạn trích ra chuỗi cuối cùng từ StringBuilder thông qua phương thức ToString()
    Ví dụ:
    Visual C# Code:
    1. //sb = "Con kien bo nhanh tren con trau"
    2.  vitri = sb.ToString().IndexOf("kien");
    3.  if (vitri > 0)
    4.      // chèn dấu phẩy ở vị trí tìm thấy + chiều dài của chuỗi con "kien"
    5.     sb.Insert(vitri + "kien".Length, ",");
    Kết quả:Con kien, bo nhanh tren con trau
    Đã được chỉnh sửa lần cuối bởi neverland87 : 11-06-2007 lúc 03:07 PM.

  2. #2
    Ngày gia nhập
    05 2007
    Bài viết
    55

    Tôi chưa sử dụng lớp này bao giờ vì thấy lớp string dùng vẫn ổn nên chưa đụng đến nó. Nay tiện có bài này nhờ bạn tóm tắt sự khác nhau giữa string và stringbuilder, khi nào thì nên dùng stringbuilder khi nào thì không? Càng ngắn càng tốt, cảm ơn bạn!
    Còn code trên tôi băn khoăn không biết cái này:
    Trích dẫn Nguyên bản được gửi bởi neverland87 Xem bài viết
    //Con kien bo nhanh tren con bo
    sb.Remove("con bo","con trau");
    //Con kien bo nhanh tren con trau
    là đúng hay bạn nhầm. Tôi nghĩ là có thể intelligent của .net làm bạn nhầm vì đều xuất phát từ "Re", đúng hơn chắc là: Replace.

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi nampt Xem bài viết
    Tôi chưa sử dụng lớp này bao giờ vì thấy lớp string dùng vẫn ổn nên chưa đụng đến nó. Nay tiện có bài này nhờ bạn tóm tắt sự khác nhau giữa string và stringbuilder, khi nào thì nên dùng stringbuilder khi nào thì không? Càng ngắn càng tốt, cảm ơn bạn!
    Còn code trên tôi băn khoăn không biết cái này:

    là đúng hay bạn nhầm. Tôi nghĩ là có thể intelligent của .net làm bạn nhầm vì đều xuất phát từ "Re", đúng hơn chắc là: Replace.
    Rất cảm ơn bạn nampt đã đưa ra lỗi to đùng này và cũng xin lỗi mọi người về việc này. Với dòng code trên, các bạn sửa lại thành:
    sb.Replace("con bo","con trau");

    Lưu ý: mình sẽ sửa lại trong bài viết trên

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    17

    chưa thể hiện đc cái hơn của StringBuilder.
    Đã được chỉnh sửa lần cuối bởi xtrung : 11-06-2007 lúc 04:56 PM.

  5. #5
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Thấy các bác bàn luận sôi nổi về String và StringBuilder, em xin đóng góp vài ý kiến qua 3 tháng học C# thông qua lớp "xóa mù lập trình" ^_^. Nếu em có nêu gì sai, các bác sửa sai dùm em nhé
    Đầu tiên, xin bàn về lớp String:
    - Lớp String cung cấp cho ta kiểu dữ liệu đối với tất cả các chuỗi. Một đối tượng String thật sự là 1 đối tượng: nó được cấp phát bộ nhớ trên heap giống như các đối tượng khác, và sẽ được thu gom bởi GC (Garbage Collection) khi được giải phóng.
    - Nhìn theo khía cạnh nguồn lực hệ thống, việc thao tác chuỗi là 1 trong những tác vụ tổn hao rất nhiều bộ nhớ. Điều này càng rõ với .NET, theo đấy tất cả các chuỗi khi được tạo ra là bất di bất dịch, nghĩa là khi bạn tạo ra 1 chuỗi, thì bạn không thể thêm gì vào nó, hoặc trích gì đó từ nó ra, hoặc thay đổi trị của nó bất cứ theo kiểu gì đó.
    Ví dụ: khi bạn ghi nối đuôi một chuỗi sau một chuỗi khác, thì CLR sẽ cho tạo 1 chuỗi hoàn toàn mới do sự phối hợp của chuỗi cũ và chuỗi mới, và cho chuỗi nguyên thủy về trạng thái sẵn sàng cho GC thu gom.

    - Đến lớp StringBuilder: "anh chàng" này ra đời đã giúp giảm thiểu việc ghi phí phạm nguồn lực của lớp String. Đối tượng StringBuilder thật sự là 1 đối tượng chứ không phải thuần túy một chuỗi. Nó có 1 vùng đệm nội tại đặc biệt dùng thao tác chuỗi nhanh và hữu hiệu hơn. StringBuilder thật sự hữu ích khi bạn cần thao tác chuỗi qui mô lớn và lặp đi lặp lại nhiều lần. StringBuilder có riêng cho mình những phương thức lo chèn, ghi nối đuôi, gỡ bỏ và thay thế chuỗi, và khi bạn làm xong việc, bạn có thể lấy ra kết quả sử dụng phương thức ToString()

    Ví dụ để so sánh:
    +Đối với StringBuilder:
    Visual C# Code:
    1. StringBuilder sb = StringBuilder("The quick brown fox jumps over the lazy dog");
    2. sb.Insert(19," happily");
    3. sb.Remove(10,6);
    4. sb.Replace("jumps"," leaps");
    5. sb.AppendFormat(" {0} times in {1} minutes",17,2);
    6. int vitri = sb.ToString().IndexOf("dog");
    7. if (vitri>0)
    8.   sb.Insert(vitri + "dog".Length,", ");
    Đoạn mã sau đây cũng thực hiện y chang những hành động kể trên, nhưng sử dụng lớp String. Nhưng bạn để ý là với đoạn mã này, CLR sẽ phải mất 5 lần khác nhau để tạo ra 1 chuỗi mới:
    Visual C# Code:
    1. int vitri;
    2. string sampleString = "The quick brown fox jumps over the lazy dog";
    3. sampleString = sampleString.Insert(19," happily");
    4. sampleString = sampleString.Remove(10,6);
    5. sampleString = sampleString.Replace("jumps","leaps");
    6. sampleString += string.Format("{0} times in {1} minutes",17,2);
    7. int vitri = sampleString.IndexOf("dog");
    8. if (vitri>0)
    9.      sampleString = sample.String.Insert(vitri + "dog".Length,", ");

  6. #6
    Ngày gia nhập
    09 2008
    Bài viết
    18

    Mặc định Thao tác với lớp StringBuilder trong lập trình C#

    đúng như neverland87 nói. theo mình biết thì trong java có lớp stringBuffer tương tự như vậy. khi đi làm cho một số công ty outsource có quy định chặt chẽ về code thì thường ko đc sử dụng String để cộng xâu mà bắt buộc phải dùng StringBuilder để cộng xâu. điều này làm tăng performance một cách đáng kể.
    nếu ai từng làm ứng dụng cho server hoặc ứng dụng mà có nhiều user truy cập vào một lúc, thì việc giảm bớt khởi tạo các object giúp tăng performance rất nhiều.
    --------------------------------------

  7. #7
    Ngày gia nhập
    12 2012
    Bài viết
    16

    Thanks bạn, rất hữu ích về xử lý chuỗi.
    đúng là công việc này tốn rất nhiều tài nguyên của máy.

Các đề tài tương tự

  1. Làm quen với 2 lớp String và StringBuilder qua ví dụ
    Gửi bởi luc13aka47 trong diễn đàn Tutorials và Thủ thuật lập trình Java
    Trả lời: 51
    Bài viết cuối: 09-03-2014, 03:18 AM
  2. ý nghĩ của StringBuilder trong C#?
    Gửi bởi thuan trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 3
    Bài viết cuối: 05-08-2011, 11:09 PM
  3. Sử lí như thế nào khi nhập rất chậm trong trình xoạn thảo trong devC
    Gửi bởi toansvcn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 23-05-2011, 10:04 PM
  4. Kiểu dữ liệu xâu thay đổi được StringBuilder?
    Gửi bởi tuan88hy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 02-12-2010, 09:32 AM
  5. StringBuilder trên C#, cách sử dụng StringBuilder trên C#
    Gửi bởi mouseover trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 19-05-2009, 03:48 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn