Delphi 2009 引入 Generics.Collections 單元,提供完整的泛型容器家族:
TList<T> - 動態陣列列表TQueue<T> / TStack<T> - 佇列/堆疊TDictionary<TKey,TValue> - 雜湊字典TObjectList<T> 等 - 物件擁有權管理版本這些泛型容器以編譯期型別安全、避免裝箱/拆箱、效能優於舊版非泛型容器,逐步取代 Classes.TList、Contnrs.TObjectList 等傳統容器。

| 分類 | 方法/屬性 | 說明 |
|---|---|---|
| 建構/銷毀 | 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;
uses Generics.Defaults;
List.Sort(TComparer<string>.Construct(
function(const Left, Right: string): Integer
begin
Result := CompareText(Left, Right); // 不分大小寫
end
));
// 需自行實作或使用 Spring4D 等庫
var filtered: TArray<string>;
filtered := List.ToArray;
filtered := TArray.Filter<string>(filtered,
function(const s: string): Boolean
begin
Result := s.StartsWith('D');
end
);
TList<T>.Create(10000) 避免多次擴容AddRange 替代迴圈 AddClear 而非 Free 重建TrimExcess 釋放多餘記憶體
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,配合預分配容量、自訂比較器、批次操作等進階技巧,即能優雅解決從簡單字串列表到複雜物件集合的各類管理需求。