習慣 LINQ 與 Lambda 後回頭維護 .NET 2.0 專案,才發現 List<T> 早已內建強大的委派型別方法:Find、FindAll、Sort。善用它們能避免手寫 foreach 迴圈,讓 2.0 時代的集合操作同樣優雅高效。
Predicate<T>:T → bool,用於篩選條件(Find/FindAll)Comparison<T>:(T, T) → int,用於排序比較(Sort)/// <summary> 檢查選單鍵值是否存在 </summary>
public bool ContainsKey(string key) {
return this.MenuEdits.Find(
new Predicate<MenuEditEntity>(delegate (MenuEditEntity entity) {
return entity.MenuKey == key;
})) != null;
}
null(參考型別)或 default(T)(實值型別)。用法與 Find 幾乎相同,差別在於回傳 List<T> 包含所有符合條件的元素:
var activeMenus = menuList.FindAll(
new Predicate<MenuEditEntity>(delegate (MenuEditEntity e) {
return e.IsActive;
}));
list.Sort(new Comparison<BaseEditor>(delegate(BaseEditor m1, BaseEditor m2) {
if (m1.TabIndex == m2.TabIndex) return 0;
return m1.TabIndex < m2.TabIndex ? -1 : 1;
}));
List<T> 進行排序。| 回傳值 | 含義 |
|---|---|
0 | 兩者相等,順序不變 |
< 0 (通常 -1) | 第一個參數排在前面 |
> 0 (通常 1) | 第一個參數排在後面 |
範例中依 TabIndex 遞增排序,m1 > m2 回傳 1 表示 m1 應排在 m2 之後。
可在委派中串聯比較邏輯:
list.Sort(delegate(Item a, Item b) {
int cmp = a.Category.CompareTo(b.Category);
if (cmp != 0) return cmp;
return a.Priority.CompareTo(b.Priority); // 次要鍵
});
即使在 .NET 2.0,Predicate<T>、Comparison<T> 搭配匿名委派已提供表達力強的集合操作能力。掌握這三個方法,能大幅減少樣板式迴圈程式碼,提升可讀與維護性。完整多載請參考 MSDN 文件。