Kelas System.Text.StringBuilder
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Kelas StringBuilder mewakili objek seperti string yang nilainya adalah urutan karakter yang dapat diubah.
StringBuilder versus jenis String
Meskipun StringBuilder dan String keduanya mewakili urutan karakter, keduanya diimplementasikan secara berbeda. String adalah jenis yang tidak dapat diubah. Artinya, setiap operasi yang tampaknya memodifikasi String objek benar-benar membuat string baru.
Misalnya, panggilan ke String.Concat metode dalam contoh C# berikut tampaknya mengubah nilai variabel string bernama value
. Bahkan, metode mengembalikan Concat value
objek yang memiliki nilai dan alamat yang berbeda dari value
objek yang diteruskan ke metode . Perhatikan bahwa contoh harus dikompilasi menggunakan /unsafe
opsi pengkompilasi.
using System;
public class Example7
{
public unsafe static void Main()
{
string value = "This is the first sentence" + ".";
fixed (char* start = value)
{
value = String.Concat(value, "This is the second sentence. ");
fixed (char* current = value)
{
Console.WriteLine(start == current);
}
}
}
}
// The example displays the following output:
// False
let mutable value = "This is the first sentence" + "."
use start = fixed value
value <- System.String.Concat(value, "This is the second sentence. ")
use current = fixed value
printfn $"{start = current}"
// The example displays the following output:
// False
Untuk rutinitas yang melakukan manipulasi string yang luas (seperti aplikasi yang memodifikasi string berkali-kali dalam perulangan), memodifikasi string berulang kali dapat memberikan penalti performa yang signifikan. Alternatifnya adalah menggunakan StringBuilder, yang merupakan kelas string yang dapat diubah. Mutabilitas berarti bahwa setelah instans kelas dibuat, instans dapat dimodifikasi dengan menambahkan, menghapus, mengganti, atau menyisipkan karakter.
Penting
StringBuilder Meskipun kelas umumnya menawarkan performa yang String lebih baik daripada kelas , Anda tidak boleh secara otomatis mengganti String dengan StringBuilder kapan pun Anda ingin memanipulasi string. Performa tergantung pada ukuran string, jumlah memori yang akan dialokasikan untuk string baru, sistem tempat kode Anda dijalankan, dan jenis operasi. Anda harus siap untuk menguji kode Anda untuk menentukan apakah StringBuilder benar-benar menawarkan peningkatan performa yang signifikan.
Pertimbangkan untuk menggunakan kelas dalam String kondisi berikut:
- Ketika jumlah perubahan yang akan dibuat kode Anda ke string kecil. Dalam kasus ini, StringBuilder mungkin menawarkan peningkatan performa yang dapat diabaikan atau tidak ada peningkatan performa atas String.
- Ketika Anda melakukan sejumlah operasi penggalian tetap, terutama dengan literal string. Dalam hal ini, pengompilasi mungkin menggabungkan operasi penggabungan ke dalam satu operasi.
- Ketika Anda harus melakukan operasi pencarian yang luas saat Anda membangun string Anda. Kelas StringBuilder tidak memiliki metode pencarian seperti
IndexOf
atauStartsWith
. Anda harus mengonversi StringBuilder objek ke String untuk operasi ini, dan ini dapat meniadakan manfaat performa dari menggunakan StringBuilder. Untuk informasi selengkapnya, lihat bagian Cari teks di objek StringBuilder.
Pertimbangkan untuk menggunakan kelas dalam StringBuilder kondisi berikut:
- Ketika Anda mengharapkan kode Anda untuk membuat sejumlah perubahan yang tidak diketahui pada string pada waktu desain (misalnya, saat Anda menggunakan perulangan untuk menggabungkan jumlah string acak yang berisi input pengguna).
- Ketika Anda mengharapkan kode Anda untuk membuat sejumlah besar perubahan pada string.
Cara kerja StringBuilder
Properti StringBuilder.Length menunjukkan jumlah karakter yang saat ini dikandung StringBuilder objek. Jika Anda menambahkan karakter ke StringBuilder objek, panjangnya meningkat hingga sama dengan ukuran StringBuilder.Capacity properti, yang menentukan jumlah karakter yang dapat dimuat objek. Jika jumlah karakter yang ditambahkan menyebabkan panjang StringBuilder objek melebihi kapasitasnya saat ini, memori baru dialokasikan, nilai Capacity properti digandakan, karakter baru ditambahkan ke StringBuilder objek, dan propertinya Length disesuaikan. Memori tambahan untuk StringBuilder objek dialokasikan secara dinamis sampai mencapai nilai yang ditentukan oleh StringBuilder.MaxCapacity properti . Ketika kapasitas maksimum tercapai, tidak ada memori lebih lanjut yang dapat dialokasikan untuk StringBuilder objek, dan mencoba menambahkan karakter atau memperluasnya di luar kapasitas maksimumnya melemparkan ArgumentOutOfRangeException pengecualian atau OutOfMemoryException .
Contoh berikut menggambarkan bagaimana StringBuilder objek mengalokasikan memori baru dan meningkatkan kapasitasnya secara dinamis saat string yang ditetapkan ke objek diperluas. Kode membuat StringBuilder objek dengan memanggil konstruktor defaultnya (tanpa parameter). Kapasitas default objek ini adalah 16 karakter, dan kapasitas maksimumnya lebih dari 2 miliar karakter. Menambahkan string "Ini adalah kalimat." menghasilkan alokasi memori baru karena panjang string (19 karakter) melebihi kapasitas StringBuilder default objek. Kapasitas objek dua kali lipat menjadi 32 karakter, string baru ditambahkan, dan panjang objek sekarang sama dengan 19 karakter. Kode kemudian menambahkan string "Ini adalah kalimat tambahan." ke nilai StringBuilder objek 11 kali. Setiap kali operasi penambalan menyebabkan panjang StringBuilder objek melebihi kapasitasnya, kapasitas yang ada digandakan dan Append operasi berhasil.
using System;
using System.Reflection;
using System.Text;
public class Example4
{
public static void Main()
{
StringBuilder sb = new StringBuilder();
ShowSBInfo(sb);
sb.Append("This is a sentence.");
ShowSBInfo(sb);
for (int ctr = 0; ctr <= 10; ctr++)
{
sb.Append("This is an additional sentence.");
ShowSBInfo(sb);
}
}
private static void ShowSBInfo(StringBuilder sb)
{
foreach (var prop in sb.GetType().GetProperties())
{
if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Capacity: 16 MaxCapacity: 2,147,483,647 Length: 0
// Capacity: 32 MaxCapacity: 2,147,483,647 Length: 19
// Capacity: 64 MaxCapacity: 2,147,483,647 Length: 50
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 81
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 112
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 143
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 174
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 205
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 236
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 267
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 298
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 329
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 360
open System.Text
let showSBInfo (sb: StringBuilder) =
for prop in sb.GetType().GetProperties() do
if prop.GetIndexParameters().Length = 0 then
printf $"{prop.Name}: {prop.GetValue sb:N0} "
printfn ""
let sb = StringBuilder()
showSBInfo sb
sb.Append "This is a sentence." |> ignore
showSBInfo sb
for i = 0 to 10 do
sb.Append "This is an additional sentence." |> ignore
showSBInfo sb
// The example displays the following output:
// Capacity: 16 MaxCapacity: 2,147,483,647 Length: 0
// Capacity: 32 MaxCapacity: 2,147,483,647 Length: 19
// Capacity: 64 MaxCapacity: 2,147,483,647 Length: 50
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 81
// Capacity: 128 MaxCapacity: 2,147,483,647 Length: 112
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 143
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 174
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 205
// Capacity: 256 MaxCapacity: 2,147,483,647 Length: 236
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 267
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 298
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 329
// Capacity: 512 MaxCapacity: 2,147,483,647 Length: 360
Imports System.Reflection
Imports System.Text
Module Example5
Public Sub Main()
Dim sb As New StringBuilder()
ShowSBInfo(sb)
sb.Append("This is a sentence.")
ShowSBInfo(sb)
For ctr As Integer = 0 To 10
sb.Append("This is an additional sentence.")
ShowSBInfo(sb)
Next
End Sub
Public Sub ShowSBInfo(sb As StringBuilder)
For Each prop In sb.GetType().GetProperties
If prop.GetIndexParameters().Length = 0 Then
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb))
End If
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' Capacity: 16 MaxCapacity: 2,147,483,647 Length: 0
' Capacity: 32 MaxCapacity: 2,147,483,647 Length: 19
' Capacity: 64 MaxCapacity: 2,147,483,647 Length: 50
' Capacity: 128 MaxCapacity: 2,147,483,647 Length: 81
' Capacity: 128 MaxCapacity: 2,147,483,647 Length: 112
' Capacity: 256 MaxCapacity: 2,147,483,647 Length: 143
' Capacity: 256 MaxCapacity: 2,147,483,647 Length: 174
' Capacity: 256 MaxCapacity: 2,147,483,647 Length: 205
' Capacity: 256 MaxCapacity: 2,147,483,647 Length: 236
' Capacity: 512 MaxCapacity: 2,147,483,647 Length: 267
' Capacity: 512 MaxCapacity: 2,147,483,647 Length: 298
' Capacity: 512 MaxCapacity: 2,147,483,647 Length: 329
' Capacity: 512 MaxCapacity: 2,147,483,647 Length: 360
Alokasi Memori
Kapasitas StringBuilder default objek adalah 16 karakter, dan kapasitas maksimum defaultnya adalah Int32.MaxValue. Nilai default ini digunakan jika Anda memanggil StringBuilder() konstruktor dan StringBuilder(String) .
Anda dapat secara eksplisit menentukan kapasitas StringBuilder awal objek dengan cara berikut:
- Dengan memanggil salah StringBuilder satu konstruktor yang menyertakan
capacity
parameter saat Anda membuat objek. - Dengan secara eksplisit menetapkan nilai baru ke StringBuilder.Capacity properti untuk memperluas objek yang ada StringBuilder . (Properti melemparkan pengecualian jika kapasitas baru kurang dari kapasitas yang ada atau lebih besar dari StringBuilder kapasitas maksimum objek.)
- Dengan memanggil StringBuilder.EnsureCapacity metode dengan kapasitas baru. Kapasitas baru tidak boleh lebih besar dari StringBuilder kapasitas maksimum objek. Namun, tidak seperti penugasan ke Capacity properti, EnsureCapacity tidak memberikan pengecualian jika kapasitas baru yang diinginkan kurang dari kapasitas yang ada. Dalam hal ini, panggilan metode tidak berpengaruh.
Jika panjang string yang ditetapkan ke StringBuilder objek dalam panggilan konstruktor melebihi kapasitas default atau kapasitas yang ditentukan, Capacity properti diatur ke panjang string yang ditentukan dengan value
parameter .
Anda dapat secara eksplisit menentukan kapasitas StringBuilder maksimum objek dengan memanggil StringBuilder(Int32, Int32) konstruktor. Anda tidak dapat mengubah kapasitas maksimum dengan menetapkan nilai baru ke MaxCapacity properti , karena bersifat baca-saja.
Seperti yang ditunjukkan bagian sebelumnya, setiap kali kapasitas yang ada tidak memadai, memori tambahan dialokasikan dan kapasitas StringBuilder objek dua kali lipat hingga nilai yang ditentukan oleh MaxCapacity properti.
Secara umum, kapasitas default dan kapasitas maksimum memadai untuk sebagian besar aplikasi. Anda mungkin mempertimbangkan untuk mengatur nilai-nilai ini dalam kondisi berikut:
- Jika ukuran StringBuilder akhirnya objek cenderung tumbuh terlalu besar, biasanya melebihi beberapa megabyte. Dalam hal ini, mungkin ada beberapa manfaat performa dari mengatur properti awal Capacity ke nilai yang sangat tinggi untuk menghilangkan kebutuhan akan terlalu banyak realokasi memori.
- Jika kode Anda berjalan pada sistem dengan memori terbatas. Dalam hal ini, Anda mungkin mempertimbangkan untuk mengatur MaxCapacity properti menjadi kurang dari Int32.MaxValue jika kode Anda menangani string besar yang dapat menyebabkannya dijalankan di lingkungan yang dibatasi memori.
Membuat instans objek StringBuilder
Anda membuat instans StringBuilder objek dengan memanggil salah satu dari enam konstruktor kelasnya yang kelebihan beban, yang tercantum dalam tabel berikut. Tiga konstruktor membuat instans StringBuilder objek yang nilainya adalah string kosong, tetapi mengatur nilai dannya Capacity MaxCapacity secara berbeda. Tiga konstruktor yang tersisa menentukan StringBuilder objek yang memiliki nilai dan kapasitas string tertentu. Dua dari tiga konstruktor menggunakan kapasitas Int32.MaxValuemaksimum default , sedangkan yang ketiga memungkinkan Anda untuk mengatur kapasitas maksimum.
Konstruktor | Nilai untai (karakter) | Kapasitas | Kapasitas maksimum |
---|---|---|---|
StringBuilder() | String.Empty | 16 | Int32.MaxValue |
StringBuilder(Int32) | String.Empty | Ditentukan oleh capacity parameter |
Int32.MaxValue |
StringBuilder(Int32, Int32) | String.Empty | Ditentukan oleh capacity parameter |
Ditentukan oleh maxCapacity parameter |
StringBuilder(String) | Ditentukan oleh value parameter |
16 atau value . Length, mana pun yang lebih besar |
Int32.MaxValue |
StringBuilder(String, Int32) | Ditentukan oleh value parameter |
Ditentukan oleh capacity parameter atau value . Length, mana pun yang lebih besar. |
Int32.MaxValue |
StringBuilder(String, Int32, Int32, Int32) | Ditentukan oleh value . Substring(startIndex , length ) |
Ditentukan oleh capacity parameter atau value . Length, mana pun yang lebih besar. |
Int32.MaxValue |
Contoh berikut menggunakan tiga kelebihan beban konstruktor ini untuk membuat StringBuilder instans objek.
using System;
using System.Text;
public class Example8
{
public static void Main()
{
string value = "An ordinary string";
int index = value.IndexOf("An ") + 3;
int capacity = 0xFFFF;
// Instantiate a StringBuilder from a string.
StringBuilder sb1 = new StringBuilder(value);
ShowSBInfo(sb1);
// Instantiate a StringBuilder from string and define a capacity.
StringBuilder sb2 = new StringBuilder(value, capacity);
ShowSBInfo(sb2);
// Instantiate a StringBuilder from substring and define a capacity.
StringBuilder sb3 = new StringBuilder(value, index,
value.Length - index,
capacity);
ShowSBInfo(sb3);
}
public static void ShowSBInfo(StringBuilder sb)
{
Console.WriteLine("\nValue: {0}", sb.ToString());
foreach (var prop in sb.GetType().GetProperties())
{
if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Value: An ordinary string
// Capacity: 18 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: An ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 15
open System.Text
let showSBInfo (sb: StringBuilder) =
for prop in sb.GetType().GetProperties() do
if prop.GetIndexParameters().Length = 0 then
printf $"{prop.Name}: {prop.GetValue sb:N0} "
printfn ""
let value = "An ordinary string"
let index = value.IndexOf "An " + 3
let capacity = 0xFFFF
// Instantiate a StringBuilder from a string.
let sb1 = StringBuilder value
showSBInfo sb1
// Instantiate a StringBuilder from string and define a capacity.
let sb2 = StringBuilder(value, capacity)
showSBInfo sb2
// Instantiate a StringBuilder from substring and define a capacity.
let sb3 = StringBuilder(value, index, value.Length - index, capacity)
showSBInfo sb3
// The example displays the following output:
// Value: An ordinary string
// Capacity: 18 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: An ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 18
//
// Value: ordinary string
// Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 15
Imports System.Text
Module Example8
Public Sub Main()
Dim value As String = "An ordinary string"
Dim index As Integer = value.IndexOf("An ") + 3
Dim capacity As Integer = &HFFFF
' Instantiate a StringBuilder from a string.
Dim sb1 As New StringBuilder(value)
ShowSBInfo(sb1)
' Instantiate a StringBuilder from string and define a capacity.
Dim sb2 As New StringBuilder(value, capacity)
ShowSBInfo(sb2)
' Instantiate a StringBuilder from substring and define a capacity.
Dim sb3 As New StringBuilder(value, index,
value.Length - index,
capacity)
ShowSBInfo(sb3)
End Sub
Public Sub ShowSBInfo(sb As StringBuilder)
Console.WriteLine()
Console.WriteLine("Value: {0}", sb.ToString())
For Each prop In sb.GetType().GetProperties
If prop.GetIndexParameters().Length = 0 Then
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb))
End If
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' Value: An ordinary string
' Capacity: 18 MaxCapacity: 2,147,483,647 Length: 18
'
' Value: An ordinary string
' Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 18
'
' Value: ordinary string
' Capacity: 65,535 MaxCapacity: 2,147,483,647 Length: 15
Memanggil metode StringBuilder
Sebagian besar metode yang memodifikasi string dalam StringBuilder instans mengembalikan referensi ke instans yang sama. Ini memungkinkan Anda untuk memanggil StringBuilder metode dengan dua cara:
Anda dapat melakukan panggilan metode individual dan mengabaikan nilai pengembalian, seperti contoh berikut.
using System; using System.Text; public class Example { public static void Main() { StringBuilder sb = new StringBuilder(); sb.Append("This is the beginning of a sentence, "); sb.Replace("the beginning of ", ""); sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete "); sb.Replace(",", "."); Console.WriteLine(sb.ToString()); } } // The example displays the following output: // This is a complete sentence.
open System.Text let sb = StringBuilder() sb.Append "This is the beginning of a sentence, " |> ignore sb.Replace("the beginning of ", "") |> ignore sb.Insert((string sb).IndexOf "a " + 2, "complete ") |> ignore sb.Replace(",", ".") |> ignore printfn $"{sb}" // The example displays the following output: // This is a complete sentence.
Imports System.Text Module Example2 Public Sub Main() Dim sb As New StringBuilder() sb.Append("This is the beginning of a sentence, ") sb.Replace("the beginning of ", "") sb.Insert(sb.ToString().IndexOf("a ") + 2, "complete ") sb.Replace(",", ".") Console.WriteLine(sb.ToString()) End Sub End Module ' The example displays the following output: ' This is a complete sentence.
Anda dapat melakukan serangkaian panggilan metode dalam satu pernyataan. Ini bisa nyaman jika Anda ingin menulis satu pernyataan yang menautkan operasi berturut-turut. Contoh berikut mengonsolidasikan tiga panggilan metode dari contoh sebelumnya ke dalam satu baris kode.
using System; using System.Text; public class Example2 { public static void Main() { StringBuilder sb = new StringBuilder("This is the beginning of a sentence, "); sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, "complete ").Replace(",", "."); Console.WriteLine(sb.ToString()); } } // The example displays the following output: // This is a complete sentence.
open System.Text let sb = StringBuilder "This is the beginning of a sentence, " sb .Replace("the beginning of ", "") .Insert((string sb).IndexOf "a " + 2, "complete ") .Replace(",", ".") |> ignore printfn $"{sb}" // The example displays the following output: // This is a complete sentence.
Imports System.Text Module Example3 Public Sub Main() Dim sb As New StringBuilder("This is the beginning of a sentence, ") sb.Replace("the beginning of ", "").Insert(sb.ToString().IndexOf("a ") + 2, "complete ").Replace(", ", ".") Console.WriteLine(sb.ToString()) End Sub End Module ' The example displays the following output: ' This is a complete sentence.
Melakukan operasi StringBuilder
Anda dapat menggunakan metode StringBuilder kelas untuk melakukan iterasi, menambahkan, menghapus, atau memodifikasi karakter dalam StringBuilder objek.
Iterasi karakter StringBuilder
Anda dapat mengakses karakter dalam StringBuilder objek dengan menggunakan StringBuilder.Chars[] properti . Di C#, Chars[] adalah pengindeks; di Visual Basic, ini adalah properti default kelas StringBuilder . Ini memungkinkan Anda untuk mengatur atau mengambil karakter individual hanya dengan menggunakan indeks mereka, tanpa secara eksplisit mereferensikan Chars[] properti. Karakter dalam StringBuilder objek dimulai pada indeks 0 (nol) dan lanjutkan ke indeks Length - 1.
Contoh berikut mengilustrasikan Chars[] properti . Ini menambahkan sepuluh angka acak ke StringBuilder objek, lalu mengurai setiap karakter. Jika kategori Unicode karakter adalah UnicodeCategory.DecimalDigitNumber, itu mengurangi angka sebesar 1 (atau mengubah angka menjadi 9 jika nilainya adalah 0). Contoh menampilkan konten StringBuilder objek baik sebelum dan sesudah nilai karakter individual diubah.
using System;
using System.Globalization;
using System.Text;
public class Example3
{
public static void Main()
{
Random rnd = new Random();
StringBuilder sb = new StringBuilder();
// Generate 10 random numbers and store them in a StringBuilder.
for (int ctr = 0; ctr <= 9; ctr++)
sb.Append(rnd.Next().ToString("N5"));
Console.WriteLine("The original string:");
Console.WriteLine(sb.ToString());
// Decrease each number by one.
for (int ctr = 0; ctr < sb.Length; ctr++)
{
if (Char.GetUnicodeCategory(sb[ctr]) == UnicodeCategory.DecimalDigitNumber)
{
int number = (int)Char.GetNumericValue(sb[ctr]);
number--;
if (number < 0) number = 9;
sb[ctr] = number.ToString()[0];
}
}
Console.WriteLine("\nThe new string:");
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
// The original string:
// 1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
// 000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
// .00000
//
// The new string:
// 0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
// 999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
// .99999
open System
open System.Globalization
open System.Text
let rnd = Random()
let sb = new StringBuilder()
// Generate 10 random numbers and store them in a StringBuilder.
for _ = 0 to 9 do
rnd.Next().ToString "N5" |> sb.Append |> ignore
printfn "The original string:"
printfn $"{sb}"
// Decrease each number by one.
for i = 0 to sb.Length - 1 do
if Char.GetUnicodeCategory(sb[i]) = UnicodeCategory.DecimalDigitNumber then
let number = Char.GetNumericValue sb.[i] |> int
let number = number - 1
let number = if number < 0 then 9 else number
sb.[i] <- number.ToString()[0]
printfn "\nThe new string:"
printfn $"{sb}"
// The example displays the following output:
// The original string:
// 1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
// 000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
// .00000
//
// The new string:
// 0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
// 999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
// .99999
Imports System.Globalization
Imports System.Text
Module Example4
Public Sub Main()
Dim rnd As New Random()
Dim sb As New StringBuilder()
' Generate 10 random numbers and store them in a StringBuilder.
For ctr As Integer = 0 To 9
sb.Append(rnd.Next().ToString("N5"))
Next
Console.WriteLine("The original string:")
Console.WriteLine(sb.ToString())
Console.WriteLine()
' Decrease each number by one.
For ctr As Integer = 0 To sb.Length - 1
If Char.GetUnicodeCategory(sb(ctr)) = UnicodeCategory.DecimalDigitNumber Then
Dim number As Integer = CType(Char.GetNumericValue(sb(ctr)), Integer)
number -= 1
If number < 0 Then number = 9
sb(ctr) = number.ToString()(0)
End If
Next
Console.WriteLine("The new string:")
Console.WriteLine(sb.ToString())
End Sub
End Module
' The example displays the following output:
' The original string:
' 1,457,531,530.00000940,522,609.000001,668,113,564.000001,998,992,883.000001,792,660,834.00
' 000101,203,251.000002,051,183,075.000002,066,000,067.000001,643,701,043.000001,702,382,508
' .00000
'
' The new string:
' 0,346,420,429.99999839,411,598.999990,557,002,453.999990,887,881,772.999990,681,559,723.99
' 999090,192,140.999991,940,072,964.999991,955,999,956.999990,532,690,932.999990,691,271,497
' .99999
Menggunakan pengindeksan berbasis karakter dengan Chars[] properti bisa sangat lambat dalam kondisi berikut:
- StringBuilder Instansnya besar (misalnya, terdiri dari beberapa puluh ribu karakter).
- Itu StringBuilder adalah "chunky." Artinya, panggilan berulang ke metode seperti StringBuilder.Append telah secara otomatis memperluas properti objek StringBuilder.Capacity dan mengalokasikan gugus memori baru untuknya.
Performa sangat terpengaruh karena setiap akses karakter memandu seluruh daftar gugus yang ditautkan untuk menemukan buffer yang benar untuk diindeks.
Catatan
Bahkan untuk objek "chunky" StringBuilder besar, menggunakan Chars[] properti untuk akses berbasis indeks ke satu atau sejumlah kecil karakter memiliki dampak performa yang dapat diabaikan; biasanya, ini adalah operasi O(n ). Dampak performa yang signifikan terjadi ketika mengulangi karakter dalam StringBuilder objek, yang merupakan operasi O(n^2).
Jika Anda mengalami masalah performa saat menggunakan pengindeksan berbasis karakter dengan StringBuilder objek, Anda dapat menggunakan salah satu solusi berikut:
Konversikan StringBuilder instans menjadi String dengan memanggil ToString metode , lalu akses karakter dalam string.
Salin konten objek yang ada StringBuilder ke objek pra-ukuran StringBuilder baru. Performa meningkat karena objek baru StringBuilder tidak gugus. Contohnya:
// sbOriginal is the existing StringBuilder object var sbNew = new StringBuilder(sbOriginal.ToString(), sbOriginal.Length);
' sbOriginal is the existing StringBuilder object Dim sbNew = New StringBuilder(sbOriginal.ToString(), sbOriginal.Length)
Atur kapasitas StringBuilder awal objek ke nilai yang kira-kira sama dengan ukuran maksimum yang diharapkan dengan memanggil StringBuilder(Int32) konstruktor. Perhatikan bahwa ini mengalokasikan seluruh blok memori meskipun StringBuilder jarang mencapai kapasitas maksimumnya.
Menambahkan teks ke objek StringBuilder
Kelas StringBuilder ini mencakup metode berikut untuk memperluas konten StringBuilder objek:
Metode ini Append menambahkan string, substring, array karakter, bagian dari array karakter, satu karakter yang diulang beberapa kali, atau representasi string dari jenis data primitif ke StringBuilder objek.
Metode menambahkan AppendLine terminator baris atau string bersama dengan terminator garis ke StringBuilder objek.
Metode menambahkan AppendFormat string format komposit ke StringBuilder objek. Representasi string objek yang disertakan dalam string hasil dapat mencerminkan konvensi pemformatan budaya sistem saat ini atau budaya tertentu.
Metode Insert ini menyisipkan string, substring, beberapa pengulangan string, array karakter, bagian dari array karakter, atau representasi string dari jenis data primitif pada posisi tertentu dalam StringBuilder objek. Posisi didefinisikan oleh indeks berbasis nol.
Contoh berikut menggunakan Appendmetode , , AppendLineAppendFormat, dan Insert untuk memperluas teks StringBuilder objek.
using System;
using System.Text;
public class Example6
{
public static void Main()
{
// Create a StringBuilder object with no text.
StringBuilder sb = new StringBuilder();
// Append some text.
sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
sb.AppendLine("\n");
sb.AppendLine("Some code points and their corresponding characters:");
// Append some formatted text.
for (int ctr = 50; ctr <= 60; ctr++)
{
sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
sb.AppendLine();
}
// Find the end of the introduction to the column.
int pos = sb.ToString().IndexOf("characters:") + 11 +
Environment.NewLine.Length;
// Insert a column header.
sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit",
"Character", "\n"));
// Convert the StringBuilder to a string and display it.
Console.WriteLine(sb.ToString());
}
}
// The example displays the following output:
// ********** Adding Text to a StringBuilder Object **********
//
// Some code points and their corresponding characters:
//
// Code Unit Character
// 0032 2
// 0033 3
// 0034 4
// 0035 5
// 0036 6
// 0037 7
// 0038 8
// 0039 9
// 003A :
// 003B ;
// 003C <
open System
open System.Text
// Create a StringBuilder object with no text.
let sb = StringBuilder()
// Append some text.
sb
.Append('*', 10)
.Append(" Adding Text to a StringBuilder Object ")
.Append('*', 10)
|> ignore
sb.AppendLine "\n" |> ignore
sb.AppendLine "Some code points and their corresponding characters:" |> ignore
// Append some formatted text.
for i = 50 to 60 do
sb.AppendFormat("{0,12:X4} {1,12}", i, Convert.ToChar i) |> ignore
sb.AppendLine() |> ignore
// Find the end of the introduction to the column.
let pos = (string sb).IndexOf("characters:") + 11 + Environment.NewLine.Length
// Insert a column header.
sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", "Character", "\n"))
|> ignore
// Convert the StringBuilder to a string and display it.
printfn $"{sb}"
// The example displays the following output:
// ********** Adding Text to a StringBuilder Object **********
//
// Some code points and their corresponding characters:
//
// Code Unit Character
// 0032 2
// 0033 3
// 0034 4
// 0035 5
// 0036 6
// 0037 7
// 0038 8
// 0039 9
// 003A :
// 003B ;
// 003C <
Imports System.Text
Module Example7
Public Sub Main()
' Create a StringBuilder object with no text.
Dim sb As New StringBuilder()
' Append some text.
sb.Append("*"c, 10).Append(" Adding Text to a StringBuilder Object ").Append("*"c, 10)
sb.AppendLine()
sb.AppendLine()
sb.AppendLine("Some code points and their corresponding characters:")
' Append some formatted text.
For ctr = 50 To 60
sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr))
sb.AppendLine()
Next
' Find the end of the introduction to the column.
Dim pos As Integer = sb.ToString().IndexOf("characters:") + 11 +
Environment.NewLine.Length
' Insert a column header.
sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit",
"Character", vbCrLf))
' Convert the StringBuilder to a string and display it.
Console.WriteLine(sb.ToString())
End Sub
End Module
' The example displays the following output:
' ********** Adding Text to a StringBuilder Object **********
'
' Some code points and their corresponding characters:
'
' Code Unit Character
' 0032 2
' 0033 3
' 0034 4
' 0035 5
' 0036 6
' 0037 7
' 0038 8
' 0039 9
' 003A :
' 003B ;
' 003C <
Menghapus teks dari objek StringBuilder
Kelas StringBuilder ini mencakup metode yang dapat mengurangi ukuran instans saat ini StringBuilder . Metode Clear menghapus semua karakter dan mengatur Length properti ke nol. Metode Remove menghapus jumlah karakter tertentu yang dimulai pada posisi indeks tertentu. Selain itu, Anda dapat menghapus karakter dari akhir StringBuilder objek dengan mengatur propertinya Length ke nilai yang kurang dari panjang instans saat ini.
Contoh berikut menghapus beberapa teks dari StringBuilder objek, menampilkan kapasitas yang dihasilkan, kapasitas maksimum, dan nilai properti panjang, lalu memanggil Clear metode untuk menghapus semua karakter dari StringBuilder objek.
using System;
using System.Text;
public class Example5
{
public static void Main()
{
StringBuilder sb = new StringBuilder("A StringBuilder object");
ShowSBInfo(sb);
// Remove "object" from the text.
string textToRemove = "object";
int pos = sb.ToString().IndexOf(textToRemove);
if (pos >= 0)
{
sb.Remove(pos, textToRemove.Length);
ShowSBInfo(sb);
}
// Clear the StringBuilder contents.
sb.Clear();
ShowSBInfo(sb);
}
public static void ShowSBInfo(StringBuilder sb)
{
Console.WriteLine("\nValue: {0}", sb.ToString());
foreach (var prop in sb.GetType().GetProperties())
{
if (prop.GetIndexParameters().Length == 0)
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb));
}
Console.WriteLine();
}
}
// The example displays the following output:
// Value: A StringBuilder object
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 22
//
// Value: A StringBuilder
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 16
//
// Value:
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 0
open System.Text
let showSBInfo (sb: StringBuilder) =
for prop in sb.GetType().GetProperties() do
if prop.GetIndexParameters().Length = 0 then
printf $"{prop.Name}: {prop.GetValue sb:N0} "
printfn ""
let sb = StringBuilder "A StringBuilder object"
showSBInfo sb
// Remove "object" from the text.
let textToRemove = "object"
let pos = (string sb).IndexOf textToRemove
if pos >= 0 then
sb.Remove(pos, textToRemove.Length) |> ignore
showSBInfo sb
// Clear the StringBuilder contents.
sb.Clear() |> ignore
showSBInfo sb
// The example displays the following output:
// Value: A StringBuilder object
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 22
//
// Value: A StringBuilder
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 16
//
// Value:
// Capacity: 22 MaxCapacity: 2,147,483,647 Length: 0
Imports System.Text
Module Example6
Public Sub Main()
Dim sb As New StringBuilder("A StringBuilder object")
ShowSBInfo(sb)
' Remove "object" from the text.
Dim textToRemove As String = "object"
Dim pos As Integer = sb.ToString().IndexOf(textToRemove)
If pos >= 0 Then
sb.Remove(pos, textToRemove.Length)
ShowSBInfo(sb)
End If
' Clear the StringBuilder contents.
sb.Clear()
ShowSBInfo(sb)
End Sub
Public Sub ShowSBInfo(sb As StringBuilder)
Console.WriteLine()
Console.WriteLine("Value: {0}", sb.ToString())
For Each prop In sb.GetType().GetProperties
If prop.GetIndexParameters().Length = 0 Then
Console.Write("{0}: {1:N0} ", prop.Name, prop.GetValue(sb))
End If
Next
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' Value: A StringBuilder object
' Capacity: 22 MaxCapacity: 2,147,483,647 Length: 22
'
' Value: A StringBuilder
' Capacity: 22 MaxCapacity: 2,147,483,647 Length: 16
'
' Value:
' Capacity: 22 MaxCapacity: 2,147,483,647 Length: 0
Mengubah teks dalam objek StringBuilder
Metode ini StringBuilder.Replace menggantikan semua kemunculan karakter atau string di seluruh StringBuilder objek atau dalam rentang karakter tertentu. Contoh berikut menggunakan Replace metode untuk mengganti semua tanda seru (!) dengan tanda tanya (?) dalam StringBuilder objek.
using System;
using System.Text;
public class Example13
{
public static void Main()
{
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Replace('!', '?');
Console.WriteLine(MyStringBuilder);
}
}
// The example displays the following output:
// Hello World?
open System.Text
let myStringBuilder = StringBuilder "Hello World!"
myStringBuilder.Replace('!', '?') |> ignore
printfn $"{myStringBuilder}"
// The example displays the following output:
// Hello World?
Imports System.Text
Module Example
Public Sub Main()
Dim MyStringBuilder As New StringBuilder("Hello World!")
MyStringBuilder.Replace("!"c, "?"c)
Console.WriteLine(MyStringBuilder)
End Sub
End Module
' The example displays the following output:
' Hello World?
Mencari teks dalam objek StringBuilder
Kelas StringBuilder tidak menyertakan metode yang mirip String.Containsdengan metode , , String.IndexOfdan String.StartsWith yang disediakan oleh String kelas , yang memungkinkan Anda mencari objek untuk karakter tertentu atau substring. Menentukan posisi karakter kehadiran atau awal substring mengharuskan Anda mencari String nilai dengan menggunakan metode pencarian string atau metode ekspresi reguler. Ada empat cara untuk menerapkan pencarian tersebut, seperti yang ditunjukkan tabel berikut.
Teknik | Pro | Kontra |
---|---|---|
Cari nilai string sebelum menambahkannya ke StringBuilder objek. | Berguna untuk menentukan apakah substring ada. | Tidak dapat digunakan ketika posisi indeks substring penting. |
Panggil ToString dan cari objek yang dikembalikan String . | Mudah digunakan jika Anda menetapkan semua teks ke StringBuilder objek, lalu mulai mengubahnya. | Rumit untuk berulang kali memanggil ToString jika Anda harus melakukan modifikasi sebelum semua teks ditambahkan ke StringBuilder objek. Anda harus ingat untuk bekerja dari akhir StringBuilder teks objek jika Anda membuat perubahan. |
Chars[] Gunakan properti untuk mencari rentang karakter secara berurutan. | Berguna jika Anda khawatir dengan karakter individual atau substring kecil. | Rumit jika jumlah karakter yang akan dicari besar atau jika logika pencarian rumit. Menghasilkan performa yang sangat buruk untuk objek yang telah tumbuh sangat besar melalui panggilan metode berulang. |
Konversi objek StringBuilder menjadi String objek, dan lakukan modifikasi pada String objek. | Berguna jika jumlah modifikasi kecil. | Meniadakan manfaat StringBuilder performa kelas jika jumlah modifikasi besar. |
Mari kita periksa teknik ini secara lebih rinci.
Jika tujuan pencarian adalah untuk menentukan apakah substring tertentu ada (yaitu, jika Anda tidak tertarik pada posisi substring), Anda dapat mencari string sebelum menyimpannya di StringBuilder objek. Contoh berikut memberikan satu kemungkinan implementasi. Ini mendefinisikan
StringBuilderFinder
kelas yang konstruktornya diteruskan referensi ke StringBuilder objek dan substring untuk ditemukan dalam string. Dalam hal ini, contoh mencoba menentukan apakah suhu yang direkam berada di Fahrenheit atau Celcius, dan menambahkan teks pengantar StringBuilder yang sesuai ke awal objek. Generator angka acak digunakan untuk memilih array yang berisi data dalam derajat Celcius atau derajat Fahrenheit.using System; using System.Text; public class Example9 { public static void Main() { Random rnd = new Random(); string[] tempF = { "47.6F", "51.3F", "49.5F", "62.3F" }; string[] tempC = { "21.2C", "16.1C", "23.5C", "22.9C" }; string[][] temps = { tempF, tempC }; StringBuilder sb = new StringBuilder(); var f = new StringBuilderFinder(sb, "F"); var baseDate = new DateTime(2013, 5, 1); String[] temperatures = temps[rnd.Next(2)]; bool isFahrenheit = false; foreach (var temperature in temperatures) { if (isFahrenheit) sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature); else isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}\n", baseDate, temperature)); baseDate = baseDate.AddDays(1); } if (isFahrenheit) { sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit"); sb.Insert(47, "\n\n"); } else { sb.Insert(0, "Average Daily Temperature in Degrees Celsius"); sb.Insert(44, "\n\n"); } Console.WriteLine(sb.ToString()); } } public class StringBuilderFinder { private StringBuilder sb; private String text; public StringBuilderFinder(StringBuilder sb, String textToFind) { this.sb = sb; this.text = textToFind; } public bool SearchAndAppend(String stringToSearch) { sb.Append(stringToSearch); return stringToSearch.Contains(text); } } // The example displays output similar to the following: // Average Daily Temperature in Degrees Celsius // // 5/1/2013: 21.2C // 5/2/2013: 16.1C // 5/3/2013: 23.5C // 5/4/2013: 22.9C
open System open System.Text type StringBuilderFinder(sb: StringBuilder, textToFind: string) = member _.SearchAndAppend(stringToSearch: string) = sb.Append stringToSearch |> ignore stringToSearch.Contains textToFind let tempF = [| "47.6F"; "51.3F"; "49.5F"; "62.3F" |] let tempC = [| "21.2C"; "16.1C"; "23.5C"; "22.9C" |] let temps = [| tempF; tempC |] let sb = StringBuilder() let f = StringBuilderFinder(sb, "F") let temperatures = temps[Random.Shared.Next(2)] let mutable baseDate = DateTime(2013, 5, 1) let mutable isFahrenheit = false for temperature in temperatures do if isFahrenheit then sb.AppendFormat("{0:d}: {1}\n", baseDate, temperature) |> ignore else isFahrenheit <- $"{baseDate:d}: {temperature}\n" |> f.SearchAndAppend baseDate <- baseDate.AddDays 1 if isFahrenheit then sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit") |> ignore sb.Insert(47, "\n\n") |> ignore else sb.Insert(0, "Average Daily Temperature in Degrees Celsius") |> ignore sb.Insert(44, "\n\n") |> ignore printfn $"{sb}" // The example displays output similar to the following: // Average Daily Temperature in Degrees Celsius // // 5/1/2013: 21.2C // 5/2/2013: 16.1C // 5/3/2013: 23.5C // 5/4/2013: 22.9C
Imports System.Text Module Example9 Public Sub Main() Dim rnd As New Random() Dim tempF() As String = {"47.6F", "51.3F", "49.5F", "62.3F"} Dim tempC() As String = {"21.2C", "16.1C", "23.5C", "22.9C"} Dim temps()() As String = {tempF, tempC} Dim sb As StringBuilder = New StringBuilder() Dim f As New StringBuilderFinder(sb, "F") Dim baseDate As New DateTime(2013, 5, 1) Dim temperatures() As String = temps(rnd.Next(2)) Dim isFahrenheit As Boolean = False For Each temperature In temperatures If isFahrenheit Then sb.AppendFormat("{0:d}: {1}{2}", baseDate, temperature, vbCrLf) Else isFahrenheit = f.SearchAndAppend(String.Format("{0:d}: {1}{2}", baseDate, temperature, vbCrLf)) End If baseDate = baseDate.AddDays(1) Next If isFahrenheit Then sb.Insert(0, "Average Daily Temperature in Degrees Fahrenheit") sb.Insert(47, vbCrLf + vbCrLf) Else sb.Insert(0, "Average Daily Temperature in Degrees Celsius") sb.Insert(44, vbCrLf + vbCrLf) End If Console.WriteLine(sb.ToString()) End Sub End Module Public Class StringBuilderFinder Private sb As StringBuilder Private text As String Public Sub New(sb As StringBuilder, textToFind As String) Me.sb = sb text = textToFind End Sub Public Function SearchAndAppend(stringToSearch As String) As Boolean sb.Append(stringToSearch) Return stringToSearch.Contains(text) End Function End Class ' The example displays output similar to the following: ' Average Daily Temperature in Degrees Celsius ' ' 5/1/2013: 21.2C ' 5/2/2013: 16.1C ' 5/3/2013: 23.5C ' 5/4/2013: 22.9C
StringBuilder.ToString Panggil metode untuk mengonversi StringBuilder objek menjadi String objek. Anda dapat mencari string dengan menggunakan metode seperti String.LastIndexOf atau String.StartsWith, atau Anda dapat menggunakan ekspresi reguler dan Regex kelas untuk mencari pola. Karena objek StringBuilder dan String menggunakan pengodean UTF-16 untuk menyimpan karakter, posisi indeks karakter, substring, dan kecocokan ekspresi reguler sama di kedua objek. Ini memungkinkan Anda menggunakan StringBuilder metode untuk membuat perubahan pada posisi yang sama di mana teks tersebut String ditemukan di objek.
Catatan
Jika Anda mengadopsi pendekatan ini, Anda harus bekerja dari akhir StringBuilder objek ke awalnya sehingga Anda tidak perlu mengonversi StringBuilder objek menjadi string berulang kali.
Contoh berikut menggambarkan pendekatan ini. Ini menyimpan empat kemunculan setiap huruf alfabet bahasa Inggris dalam objek StringBuilder . Kemudian mengonversi teks menjadi String objek dan menggunakan ekspresi reguler untuk mengidentifikasi posisi awal setiap urutan empat karakter. Akhirnya, ia menambahkan garis bawah sebelum setiap urutan empat karakter kecuali untuk urutan pertama, dan mengonversi karakter pertama dari urutan menjadi huruf besar.
using System; using System.Text; using System.Text.RegularExpressions; public class Example10 { public static void Main() { // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. StringBuilder sb = new StringBuilder(); for (ushort ctr = (ushort)'a'; ctr <= (ushort)'z'; ctr++) sb.Append(Convert.ToChar(ctr), 4); // Create a parallel string object. String sbString = sb.ToString(); // Determine where each new character sequence begins. String pattern = @"(\w)\1+"; MatchCollection matches = Regex.Matches(sbString, pattern); // Uppercase the first occurrence of the sequence, and separate it // from the previous sequence by an underscore character. for (int ctr = matches.Count - 1; ctr >= 0; ctr--) { Match m = matches[ctr]; sb[m.Index] = Char.ToUpper(sb[m.Index]); if (m.Index > 0) sb.Insert(m.Index, "_"); } // Display the resulting string. sbString = sb.ToString(); int line = 0; do { int nChars = line * 80 + 79 <= sbString.Length ? 80 : sbString.Length - line * 80; Console.WriteLine(sbString.Substring(line * 80, nChars)); line++; } while (line * 80 < sbString.Length); } } // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
open System open System.Text open System.Text.RegularExpressions // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. let sb = StringBuilder() for char in 'a' .. 'z' do sb.Append(char, 4) |> ignore // Create a parallel string object. let sbString = string sb // Determine where each new character sequence begins. let pattern = @"(\w)\1+" let matches = Regex.Matches(sbString, pattern) // Uppercase the first occurrence of the sequence, and separate it // from the previous sequence by an underscore character. for i = matches.Count - 1 downto 0 do let m = matches[i] sb[m.Index] <- Char.ToUpper sb[m.Index] if m.Index > 0 then sb.Insert(m.Index, "_") |> ignore // Display the resulting string. let sbString2 = string sb for line = 0 to (sbString2.Length - 1) / 80 do let nChars = if line * 80 + 79 <= sbString2.Length then 80 else sbString2.Length - line * 80 printfn $"{sbString2.Substring(line * 80, nChars)}" // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Imports System.Text Imports System.Text.RegularExpressions Module Example10 Public Sub Main() ' Create a StringBuilder object with 4 successive occurrences ' of each character in the English alphabet. Dim sb As New StringBuilder() For ctr As UShort = AscW("a") To AscW("z") sb.Append(ChrW(ctr), 4) Next ' Create a parallel string object. Dim sbString As String = sb.ToString() ' Determine where each new character sequence begins. Dim pattern As String = "(\w)\1+" Dim matches As MatchCollection = Regex.Matches(sbString, pattern) ' Uppercase the first occurrence of the sequence, and separate it ' from the previous sequence by an underscore character. For ctr As Integer = matches.Count - 1 To 0 Step -1 Dim m As Match = matches(ctr) sb.Chars(m.Index) = Char.ToUpper(sb.Chars(m.Index)) If m.Index > 0 Then sb.Insert(m.Index, "_") Next ' Display the resulting string. sbString = sb.ToString() Dim line As Integer = 0 Do Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 80, sbString.Length - line * 80) Console.WriteLine(sbString.Substring(line * 80, nChars)) line += 1 Loop While line * 80 < sbString.Length End Sub End Module ' The example displays the following output: ' Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ ' Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
StringBuilder.Chars[] Gunakan properti untuk mencari rentang karakter secara berurutan dalam objekStringBuilder. Pendekatan ini mungkin tidak praktis jika jumlah karakter yang akan dicari besar atau logika pencarian sangat kompleks. Untuk implikasi performa akses berbasis indeks karakter demi karakter untuk objek yang sangat besar dan terpotong StringBuilder , lihat dokumentasi untuk StringBuilder.Chars[] properti .
Contoh berikut identik dalam fungsionalitas dengan contoh sebelumnya tetapi berbeda dalam implementasi. Ini menggunakan Chars[] properti untuk mendeteksi kapan nilai karakter telah berubah, menyisipkan garis bawah pada posisi tersebut, dan mengonversi karakter pertama dalam urutan baru menjadi huruf besar.
using System; using System.Text; public class Example11 { public static void Main() { // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. StringBuilder sb = new StringBuilder(); for (ushort ctr = (ushort)'a'; ctr <= (ushort)'z'; ctr++) sb.Append(Convert.ToChar(ctr), 4); // Iterate the text to determine when a new character sequence occurs. int position = 0; Char current = '\u0000'; do { if (sb[position] != current) { current = sb[position]; sb[position] = Char.ToUpper(sb[position]); if (position > 0) sb.Insert(position, "_"); position += 2; } else { position++; } } while (position <= sb.Length - 1); // Display the resulting string. String sbString = sb.ToString(); int line = 0; do { int nChars = line * 80 + 79 <= sbString.Length ? 80 : sbString.Length - line * 80; Console.WriteLine(sbString.Substring(line * 80, nChars)); line++; } while (line * 80 < sbString.Length); } } // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
open System open System.Text // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. let sb = StringBuilder() for char in 'a' .. 'z' do sb.Append(char, 4) |> ignore // Iterate the text to determine when a new character sequence occurs. let mutable position = 0 let mutable current = '\u0000' while position <= sb.Length - 1 do if sb[position] <> current then current <- sb[position] sb[position] <- Char.ToUpper sb[position] if position > 0 then sb.Insert(position, "_") |> ignore position <- position + 2 else position <- position + 1 // Display the resulting string. let sbString = string sb for line = 0 to (sbString.Length - 1) / 80 do let nChars = if line * 80 + 79 <= sbString.Length then 80 else sbString.Length - line * 80 printfn $"{sbString.Substring(line * 80, nChars)}" // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Imports System.Text Module Example11 Public Sub Main() ' Create a StringBuilder object with 4 successive occurrences ' of each character in the English alphabet. Dim sb As New StringBuilder() For ctr As UShort = AscW("a") To AscW("z") sb.Append(ChrW(ctr), 4) Next ' Iterate the text to determine when a new character sequence occurs. Dim position As Integer = 0 Dim current As Char = ChrW(0) Do If sb(position) <> current Then current = sb(position) sb(position) = Char.ToUpper(sb(position)) If position > 0 Then sb.Insert(position, "_") position += 2 Else position += 1 End If Loop While position <= sb.Length - 1 ' Display the resulting string. Dim sbString As String = sb.ToString() Dim line As Integer = 0 Do Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 80, sbString.Length - line * 80) Console.WriteLine(sbString.Substring(line * 80, nChars)) line += 1 Loop While line * 80 < sbString.Length End Sub End Module ' The example displays the following output: ' Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ ' Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Simpan semua teks yang tidak dimodifikasi dalam StringBuilder objek, panggil StringBuilder.ToString metode untuk mengonversi StringBuilder objek menjadi String objek, dan melakukan modifikasi pada String objek. Anda dapat menggunakan pendekatan ini jika Anda hanya memiliki beberapa modifikasi; jika tidak, biaya bekerja dengan string yang tidak dapat diubah dapat meniadakan manfaat performa menggunakan StringBuilder objek.
Contoh berikut identik dalam fungsionalitas dengan dua contoh sebelumnya tetapi berbeda dalam implementasi. Ini membuat StringBuilder objek, mengonversinya menjadi String objek, lalu menggunakan ekspresi reguler untuk melakukan semua modifikasi yang tersisa pada string. Metode ini Regex.Replace(String, String, MatchEvaluator) menggunakan ekspresi lambda untuk melakukan penggantian pada setiap kecocokan.
using System; using System.Text; using System.Text.RegularExpressions; public class Example12 { public static void Main() { // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. StringBuilder sb = new StringBuilder(); for (ushort ctr = (ushort)'a'; ctr <= (ushort)'z'; ctr++) sb.Append(Convert.ToChar(ctr), 4); // Convert it to a string. String sbString = sb.ToString(); // Use a regex to uppercase the first occurrence of the sequence, // and separate it from the previous sequence by an underscore. string pattern = @"(\w)(\1+)"; sbString = Regex.Replace(sbString, pattern, m => (m.Index > 0 ? "_" : "") + m.Groups[1].Value.ToUpper() + m.Groups[2].Value); // Display the resulting string. int line = 0; do { int nChars = line * 80 + 79 <= sbString.Length ? 80 : sbString.Length - line * 80; Console.WriteLine(sbString.Substring(line * 80, nChars)); line++; } while (line * 80 < sbString.Length); } } // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
open System.Text open System.Text.RegularExpressions // Create a StringBuilder object with 4 successive occurrences // of each character in the English alphabet. let sb = StringBuilder() for char in 'a' .. 'z' do sb.Append(char, 4) |> ignore // Convert it to a string. let sbString = string sb // Use a regex to uppercase the first occurrence of the sequence, // and separate it from the previous sequence by an underscore. let pattern = @"(\w)(\1+)" let sbStringReplaced = Regex.Replace( sbString, pattern, fun m -> (if m.Index > 0 then "_" else "") + m.Groups[ 1 ].Value.ToUpper() + m.Groups[2].Value ) // Display the resulting string. for line = 0 to (sbStringReplaced.Length - 1) / 80 do let nChars = if line * 80 + 79 <= sbStringReplaced.Length then 80 else sbStringReplaced.Length - line * 80 printfn $"{sbStringReplaced.Substring(line * 80, nChars)}" // The example displays the following output: // Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ // Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Imports System.Text Imports System.Text.RegularExpressions Module Example12 Public Sub Main() ' Create a StringBuilder object with 4 successive occurrences ' of each character in the English alphabet. Dim sb As New StringBuilder() For ctr As UShort = AscW("a") To AscW("z") sb.Append(ChrW(ctr), 4) Next ' Convert it to a string. Dim sbString As String = sb.ToString() ' Use a regex to uppercase the first occurrence of the sequence, ' and separate it from the previous sequence by an underscore. Dim pattern As String = "(\w)(\1+)" sbString = Regex.Replace(sbString, pattern, Function(m) If(m.Index > 0, "_", "") + m.Groups(1).Value.ToUpper + m.Groups(2).Value) ' Display the resulting string. Dim line As Integer = 0 Do Dim nChars As Integer = If(line * 80 + 79 <= sbString.Length, 80, sbString.Length - line * 80) Console.WriteLine(sbString.Substring(line * 80, nChars)) line += 1 Loop While line * 80 < sbString.Length End Sub End Module ' The example displays the following output: ' Aaaa_Bbbb_Cccc_Dddd_Eeee_Ffff_Gggg_Hhhh_Iiii_Jjjj_Kkkk_Llll_Mmmm_Nnnn_Oooo_Pppp_ ' Qqqq_Rrrr_Ssss_Tttt_Uuuu_Vvvv_Wwww_Xxxx_Yyyy_Zzzz
Mengonversi objek StringBuilder menjadi string
Anda harus mengonversi objek StringBuilder menjadi objek String sebelum dapat meneruskan string yang direpresentasikan oleh objek StringBuilder ke metode yang memiliki parameter String atau menampilkannya di antarmuka pengguna. Anda melakukan konversi ini dengan memanggil StringBuilder.ToString metode . Untuk ilustrasi, lihat contoh sebelumnya, yang memanggil ToString metode untuk mengonversi StringBuilder objek ke string sehingga dapat diteruskan ke metode ekspresi reguler.