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

Delphi 2009 泛型列表 TList<T> 完整教學:強型別集合操作大全

     編輯:Delphi

泛型容器新紀元

Delphi 2009 引入 Generics.Collections 單元,提供完整的泛型容器家族:

  • TList<T> - 動態陣列列表
  • TQueue<T> / TStack<T> - 佇列/堆疊
  • TDictionary<TKey,TValue> - 雜湊字典
  • TObjectList<T> 等 - 物件擁有權管理版本

這些泛型容器以編譯期型別安全、避免裝箱/拆箱、效能優於舊版非泛型容器,逐步取代 Classes.TList、Contnrs.TObjectList 等傳統容器。

執行效果動畫

TList<T> 核心 API 完整速查

分類方法/屬性說明
建構/銷毀Create / Create(Capacity)建立實例,可預分配容量
Free釋放實例 (不釋放元素物件)
Clear清空所有元素
新增/插入Add(item)尾端新增,回傳索引
Insert(index, item)指定位置插入
AddRange(array)批次新增陣列/可列舉集合
AddRange(collection)批次新增另一集合元素
AddRange(enumerable)支援 IEnumerable<T> 來源
移除/刪除Remove(item)移除第一個符合項目,回傳 Boolean
RemoveAt(index)移除指定索引項目
Delete(index)同 RemoveAt (別名)
DeleteRange(index, count)批次刪除區間
查詢/搜尋IndexOf(item)正向搜尋索引,找不到回傳 -1
LastIndexOf(item)反向搜尋索引
Contains(item)是否包含項目 (Boolean)
BinarySearch(item, out index)二分搜尋需先排序
Items[index]索引器存取 (預設屬性)
排序/重組Sort / Sort(comparer)預設用 Default 比較器
Reverse反轉順序
TrimExcess釋放多餘容量記憶體
ToArray轉為 TArray<T>
屬性Count, Capacity元素數 / 內部配置容量

完整實作範例:字串列表全功能測試器

表單佈局

  • 左側 TMemo 顯示列表內容
  • 右側 TEdit 輸入字串 + 10 個功能按鈕

核心程式碼


uses Generics.Collections;

var
  List: TList<string>;
  str: string = 'Test';

procedure TForm1.FormCreate(Sender: TObject);
begin
  List := TList<string>.Create;
  Memo1.Clear;
  Edit1.Text := str;
  // 按鈕標題設定:顯示、新增、插入、刪除1、刪除2、查找、排序、翻轉、清空、新增陣列
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  List.Free;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Text <> '' then str := Edit1.Text;
end;

// 顯示所有
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  Memo1.Clear;
  for i := 0 to List.Count - 1 do
    Memo1.Lines.Add(List[i]);
  Caption := Format('目前總數: %d', [List.Count]);
end;

// 新增到尾端
procedure TForm1.Button2Click(Sender: TObject);
begin
  List.Add(str);
  Button1.Click;
end;

// 插入到最前面
procedure TForm1.Button3Click(Sender: TObject);
begin
  List.Insert(0, str);
  Button1.Click;
end;

// 依索引刪除 (第一筆)
procedure TForm1.Button4Click(Sender: TObject);
begin
  List.RemoveAt(0);
  Button1.Click;
end;

// 依內容刪除 (第一筆)
procedure TForm1.Button5Click(Sender: TObject);
var s: string;
begin
  s := List[0];
  List.Remove(s);
  Button1.Click;
end;

// 查找
procedure TForm1.Button6Click(Sender: TObject);
var n: Integer;
begin
  n := List.IndexOf(str);
  if n = -1 then ShowMessage('找不到')
  else ShowMessageFmt('%s 是第 %d 個', [str, n+1]);
end;

// 排序
procedure TForm1.Button7Click(Sender: TObject);
begin
  List.Sort;
  Button1.Click;
end;

// 翻轉
procedure TForm1.Button8Click(Sender: TObject);
begin
  List.Reverse;
  Button1.Click;
end;

// 清空
procedure TForm1.Button9Click(Sender: TObject);
begin
  List.Clear;
  Button1.Click;
end;

// 批次新增陣列
procedure TForm1.Button10Click(Sender: TObject);
const
  arr: array[0..2] of string = ('CodeGear', 'Delphi', '2009');
begin
  List.Add('Embarcadero');
  List.AddRange(arr);
  Button1.Click;
end;

進階技巧與最佳實務

1. 自訂排序比較器


uses Generics.Defaults;

List.Sort(TComparer<string>.Construct(
  function(const Left, Right: string): Integer
  begin
    Result := CompareText(Left, Right); // 不分大小寫
  end
));

2. Lambda 篩選與投影 (配合 LINQ 風格輔助函式)


// 需自行實作或使用 Spring4D 等庫
var filtered: TArray<string>;
filtered := List.ToArray;
filtered := TArray.Filter<string>(filtered,
  function(const s: string): Boolean
  begin
    Result := s.StartsWith('D');
  end
);

3. 大量資料效能優化

  • 預估筆數用 TList<T>.Create(10000) 避免多次擴容
  • 批次操作用 AddRange 替代迴圈 Add
  • 頻繁清空重用用 Clear 而非 Free 重建
  • 完成後呼叫 TrimExcess 釋放多餘記憶體

4. 列舉器模式遍歷


for s in List do
  Memo1.Lines.Add(s);
// 或
for var i := 0 to List.Count - 1 do
  Memo1.Lines.Add(List[i]);

常見陷阱與避坑指南

陷阱後果正確做法
遍歷時刪除元素索引錯亂、漏刪、AV反向迴圈 for i := Count-1 downto 0 或收集索引後批次刪除
物件元素未釋放記憶體洩漏用 TObjectList<T> 或手動 Free
BinarySearch 未排序結果錯誤先呼叫 Sort
索引越界EListError存取前檢查 IndexOf >= 0

總結

TList<T> 作為泛型容器基石,提供豐富、強型別、高效能的列表操作。掌握 Add/Insert/Remove/IndexOf/Sort/Reverse 核心 API,配合預分配容量、自訂比較器、批次操作等進階技巧,即能優雅解決從簡單字串列表到複雜物件集合的各類管理需求。

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