StringBuilder類的使用
String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要為該新對象分配新的空間。在需要對字符串執行重復修改的情況下,與創建新的 String 對象相關的系統開銷可能會非常昂貴。如果要修改字符串而不創建新的對象,則可以使用 System.Text.StringBuilder 類。例如,當在一個循環中將許多字符串連接在一起時,使用 StringBuilder 類可以提升性能。
通過用一個重載的構造函數方法初始化變量,可以創建 StringBuilder 類的新實例,正如以下示例中所闡釋的那樣。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!") [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
設置容量和長度
雖然 StringBuilder 對象是動態對象,允許擴充它所封裝的字符串中字符的數量,但是您可以為它可容納的最大字符數指定一個值。此值稱為該對象的容量,不應將它與當前 StringBuilder 對象容納的字符串長度混淆在一起。例如,可以創建 StringBuilder 類的帶有字符串“Hello”(長度為 5)的一個新實例,同時可以指定該對象的最大容量為 25。當修改 StringBuilder 時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。可以使用重載的構造函數之一來指定 StringBuilder 類的容量。以下代碼示例指定可以將 MyStringBuilder
對象擴充到最大 25 個空白。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!", 25) [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);
另外,可以使用讀/寫 Capacity 屬性來設置對象的最大長度。以下代碼示例使用 Capacity 屬性來定義對象的最大長度。
[Visual Basic] MyStringBuilder.Capacity = 25 [C#] MyStringBuilder.Capacity = 25;
EnsureCapacity 方法可用來檢查當前 StringBuilder 的容量。如果容量大于傳遞的值,則不進行任何更改;但是,如果容量小于傳遞的值,則會更改當前的容量以使其與傳遞的值匹配。
也可以查看或設置 Length 屬性。如果將 Length 屬性設置為大于 Capacity 屬性的值,則自動將 Capacity 屬性更改為與 Length 屬性相同的值。如果將 Length 屬性設置為小于當前 StringBuilder 對象內的字符串長度的值,則會縮短該字符串。
修改 StringBuilder 字符串
下表列出了可以用來修改 StringBuilder 的內容的方法。
方法名 | 使用 |
---|---|
StringBuilder.Append | 將信息追加到當前 StringBuilder 的結尾。 |
StringBuilder.AppendFormat | 用帶格式文本替換字符串中傳遞的格式說明符。 |
StringBuilder.Insert | 將字符串或對象插入到當前 StringBuilder 對象的指定索引處。 |
StringBuilder.Remove | 從當前 StringBuilder 對象中移除指定數量的字符。 |
StringBuilder.Replace | 替換指定索引處的指定字符。 |
Append
Append 方法可用來將文本或對象的字符串表示形式添加到由當前 StringBuilder 對象表示的字符串的結尾處。以下示例將一個 StringBuilder 對象初始化為“Hello World”,然后將一些文本追加到該對象的結尾處。將根據需要自動分配空間。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!") MyStringBuilder.Append(" What a beautiful day.") Console.WriteLine(MyStringBuilder) [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Append(" What a beautiful day."); Console.WriteLine(MyStringBuilder);
此示例將 Hello World! What a beautiful day.
顯示到控制臺。
AppendFormat
AppendFormat 方法將文本添加到 StringBuilder 的結尾處,而且實現了 IFormattable 接口,因此可接受格式化部分中描述的標準格式字符串。可以使用此方法來自定義變量的格式并將這些值追加到 StringBuilder 的后面。以下示例使用 AppendFormat 方法將一個設置為貨幣值格式的整數值放置到 StringBuilder 的結尾。
[Visual Basic] Dim MyInt As Integer = 25 Dim MyStringBuilder As New StringBuilder("Your total is ") MyStringBuilder.AppendFormat("{0:C} ", MyInt) Console.WriteLine(MyStringBuilder) [C#] int MyInt = 25; StringBuilder MyStringBuilder = new StringBuilder("Your total is "); MyStringBuilder.AppendFormat("{0:C} ", MyInt); Console.WriteLine(MyStringBuilder);
此示例將 Your total is $25.00
顯示到控制臺。
Insert
Insert 方法將字符串或對象添加到當前 StringBuilder 中的指定位置。以下示例使用此方法將一個單詞插入到 StringBuilder 的第六個位置。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!") MyStringBuilder.Insert(6, "Beautiful ") Console.WriteLine(MyStringBuilder) [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Insert(6,"Beautiful "); Console.WriteLine(MyStringBuilder);
此示例將 Hello Beautiful World!
顯示到控制臺。
Remove
可以使用 Remove 方法從當前 StringBuilder 中移除指定數量的字符,移除過程從指定的從零開始的索引處開始。以下示例使用 Remove 方法縮短 StringBuilder。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!") MyStringBuilder.Remove(5, 7) Console.WriteLine(MyStringBuilder) [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Remove(5,7); Console.WriteLine(MyStringBuilder);
此示例將 Hello
顯示到控制臺。
Replace
使用 Replace 方法,可以用另一個指定的字符來替換 StringBuilder 對象內的字符。以下示例使用 Replace 方法來搜索 StringBuilder 對象,查找所有的感嘆號字符 (!),并用問號字符 (?) 來替換它們。
[Visual Basic] Dim MyStringBuilder As New StringBuilder("Hello World!") MyStringBuilder.Replace("!"c, "?"c) Console.WriteLine(MyStringBuilder) [C#] StringBuilder MyStringBuilder = new StringBuilder("Hello World!"); MyStringBuilder.Replace('!', '?'); Console.WriteLine(MyStringBuilder);
此示例將 Hello World?
顯示到控制臺。
實例講解開始頁面
protected void lbtnChongYin_Click(object sender, EventArgs e)
{
//創建可變字符串
StringBuilder s = new StringBuilder();
int i = 0;
foreach (DataListItem dli in this.DataList1.Items)
{
if (((CheckBox)(dli.FindControl("CheckBox1"))).Checked == true)
{
s.Append(",").Append(this.DataList1.DataKeys[dli.ItemIndex].ToString());
i++;
}
}
string photoStr = s.ToString().Substring(1, s.ToString().Length - 1);
Response.Redirect("chongyin.aspx?photoStr="+photoStr.ToString());
}
另一個頁面接受
if (!this.IsPostBack)
{
string photoString = Request.QueryString["photoStr"].ToString().Trim();
//this.lblStr.Text = photoString;
string conStr = System.Configuration.ConfigurationSettings.AppSettings["conStr"] + System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["dbPath"]) + ";";
OleDbConnection con = new OleDbConnection(conStr);
OleDbDataAdapter oda = new OleDbDataAdapter();
con.Open();
oda.SelectCommand = new OleDbCommand("select * from photo where photo_Id in (" + photoString + ")", con);
DataSet ds = new DataSet();
oda.Fill(ds, "photo");
this.GridView1.DataSource = ds.Tables["photo"];
this.GridView1.DataBind();
con.Close();
}