首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 TStringBuilder 進階:ToString 方法與子字串擷取技巧

     編輯:Delphi

TStringBuilder.ToString:不只是轉字串

TStringBuilder 的 ToString 方法提供兩種重載,支援完整輸出與區間擷取,避免建立中間字串副本,提升效能。

核心 API

方法參數回傳說明
ToString無string輸出完整緩衝區內容
ToStringStartIndex, Length: Integerstring擷取指定範圍子字串 (0-based)

完整實作程式碼


procedure TForm1.Button1Click(Sender: TObject);
var
  sb: TStringBuilder;
begin
  sb := TStringBuilder.Create('123456789');
  try
    ShowMessage(sb.ToString);       // '123456789' - 完整輸出
    ShowMessage(sb.ToString(3, 4)); // '4567' - 從索引 3 取 4 字元
  finally
    sb.Free;
  end;
end;

參數詳解:StartIndex 與 Length

  • StartIndex:0-based 起始索引,0 代表第一個字元
  • Length:要擷取的字元數
  • 範例:'123456789'.ToString(3, 4) → 索引 3='4',取 4 個 → '4567'
  • 邊界檢查:超出範圍會拋出 EArgumentOutOfRangeException

效能優勢:避免中間副本


// 傳統字串操作:每次操作產生新字串
var s: string;
s := '123456789';
s := Copy(s, 4, 4); // 產生新字串 '4567'

// TStringBuilder:同一緩衝區直接擷取
var sb: TStringBuilder;
sb := TStringBuilder.Create('123456789');
var sub := sb.ToString(3, 4); // 直接從緩衝區複製,無額外建構器分配

進階應用場景

1. 串流式處理大量文字:分段輸出


procedure ProcessLargeText(const Input: string);
var
  sb: TStringBuilder;
  chunk: string;
  i: Integer;
begin
  sb := TStringBuilder.Create(Input.Length);
  try
    // 模擬分塊處理
    for i := 1 to Input.Length div 1000 do
    begin
      chunk := sb.ToString((i-1)*1000, 1000); // 高效擷取區塊
      ProcessChunk(chunk);
    end;
    // 處理餘數
    if Input.Length mod 1000 > 0 then
      ProcessChunk(sb.ToString((Input.Length div 1000)*1000, Input.Length mod 1000));
  finally
    sb.Free;
  end;
end;

2. 解析結構化文字:固定寬度欄位


type
  TRecord = record
    ID: string[10];
    Name: string[20];
    Value: string[15];
  end;

function ParseFixedWidth(const Line: string): TRecord;
var sb: TStringBuilder;
begin
  sb := TStringBuilder.Create(Line);
  try
    Result.ID := Trim(sb.ToString(0, 10));
    Result.Name := Trim(sb.ToString(10, 20));
    Result.Value := Trim(sb.ToString(30, 15));
  finally
    sb.Free;
  end;
end;

3. 配合 Chars[] 進行字元級檢查後再擷取


function ExtractToken(sb: TStringBuilder; Start: Integer; Delimiter: Char): string;
var
  i, len: Integer;
begin
  len := 0;
  for i := Start to sb.Length - 1 do
    if sb.Chars[i] = Delimiter then Break else Inc(len);
  Result := sb.ToString(Start, len);
end;

ToString vs 其他輸出方式對比

方式完整輸出區間擷取效能記憶體
sb.ToString✅✅ (StartIndex, Length)高單次分配
string(sb) 隱性轉換✅❌高單次分配
sb.Chars[i] 迴圈✅✅低 (逐字元)無額外
Copy(string(sb), ...)✅✅中 (雙重分配)雙重分配

最佳實務建議

  • 優先使用 ToString(StartIndex, Length) 進行區間擷取,避免 Copy(string(sb), ...) 的雙重分配
  • 大量擷取時:考慮直接操作 Chars[] 或 CopyTo 到字元陣列
  • 記得 Free:TStringBuilder 非介面型別,需手動釋放
  • 預分配容量:TStringBuilder.Create(預估長度) 減少擴容開銷

總結

TStringBuilder.ToString 的雙重載設計 (ToString / ToString(StartIndex, Length)) 同時滿足完整輸出與高效區間擷取需求。配合 Chars[] 字元級存取,構成了高效能字串建構與解析的完整工具鏈,是處理大量文字、固定寬度解析、串流分段的最佳選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved