Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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:

    Mã:
    StringBuilder sb = new StringBuilder(); // bộ khởi tạo với chuỗi sb rỗng
    Mã:
    StringBuilder sb = new StringBuilder(int <chiều dài chuỗi>)//Ví dụ:StringBuilder sb = new StringBuilder(26); // sb rỗng, có chiều dài là 26
    Mã:
    StringBuilder sb = new StringBuilder(<chuỗi khởi tạo>)//Ví dụ:StringBuilder sb = new StringBuilder("Hello world"); // sb = "Hello world"
    Mã:
    StringBuilder sb = new StringBuilder(<chuỗi khởi tạo>,<chiều dài chuỗi>)//Ví dụ:StringBuilder sb = new StringBuilder("Hello world",100);// 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:

    Mã:
    - 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- sb.Remove(<chỉ mục bắt đầu>,<số ký tự cần xóa>)- sb.Replace(<chuỗi con cần thay thế>,<chuỗi con mới>)
    Ví dụ:

    Mã:
    StringBuilder sb = new StringBuilder("Con kien bo tren lung con bo");sb.Insert(12,"nhanh ");//Con kien bo nhanh tren lung con bosb.Remove(23,5);//Con kien bo nhanh tren con bosb.Replace("con bo","con trau");//Con kien bo nhanh tren con trausb.AppendFormat(" voi van toc {0} m/s",1);//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ụ:

    Mã:
    //sb = "Con kien bo nhanh tren con trau" vitri = sb.ToString().IndexOf("kien"); if (vitri > 0)     // chèn dấu phẩy ở vị trí tìm thấy + chiều dài của chuỗi con "kien"    sb.Insert(vitri + "kien".Length, ",");
    Kết quả:Con kien, bo nhanh tren con trau

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 Gửi bởi neverland87
    //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 tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nampt
    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
    chưa thể hiện đc cái hơn của StringBuilder.

  5. #5
    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:

    Mã:
    StringBuilder sb = StringBuilder("The quick brown fox jumps over the lazy dog");sb.Insert(19," happily");sb.Remove(10,6);sb.Replace("jumps"," leaps");sb.AppendFormat(" {0} times in {1} minutes",17,2);int vitri = sb.ToString().IndexOf("dog");if (vitri>0)  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:

    Mã:
    int vitri;string sampleString = "The quick brown fox jumps over the lazy dog";sampleString = sampleString.Insert(19," happily");sampleString = sampleString.Remove(10,6);sampleString = sampleString.Replace("jumps","leaps");sampleString += string.Format("{0} times in {1} minutes",17,2);int vitri = sampleString.IndexOf("dog");if (vitri>0)     sampleString = sample.String.Insert(vitri + "dog".Length,", ");

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đú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 tham gia
    Sep 2015
    Bài viết
    0
    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.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •