.NET 內建 List<T>.FindAll 讓篩選操作極為簡潔:
List found = thelib.FindAll(delegate(Book book) {
return book.ISBN.StartsWith("...");
});
若自訂 Library 類別使用特殊資料結構 (非 List<T>),能否提供相同語法?答案是肯定的。
public delegate bool Predicate(T obj);
這本質上是註冊一個「搜尋回呼」,配合內部遍歷機制,形成 Closure (閉包) 模式:演算法邏輯固定,判斷條件外部注入。
public class MyVec
{
// 內部儲存 - 此處用 List 驗證概念,實際可換任何支援 foreach 的結構
private List _list = new List();
// 運算子多載:支援 vec += item 語法
public static MyVec operator +(MyVec a, T b)
{
a._list.Add(b);
return a;
}
// 篩選演算法 - 核心實作
public MyVec FindAll(Predicate act)
{
MyVec result = new MyVec();
foreach (T item in _list)
{
if (act(item))
result._list.Add(item);
}
return result;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
foreach (T item in _list)
{
sb.Append(item.ToString()).Append(",");
}
return sb.Length > 0 ? sb.Remove(sb.Length - 1, 1).ToString() : "";
}
}
IEnumerable 隱含介面,解耦儲存結構FindAll 回傳 MyVec<T>,支援鏈式操作同樣模式可實作 Find、Exists、TrueForAll、ConvertAll、Sort 等演算法,構建完整的集合演算法庫。下篇將展示更複雜的資料結構實作。