前文介紹索引器封裝固定檢索邏輯。本文展示如何透過委派(Func、Predicate)將檢索策略外部化,使索引器具備類 SQL WHERE 子句的靈活篩選能力。
public class DataRepository
{
private List _items = new List();
// 索引器接受委派,回傳符合條件的子集
public IEnumerable this[Func predicate]
{
get => _items.Where(predicate);
}
// 多條件組合範例
public IEnumerable this[Func p1, Func p2]
{
get => _items.Where(p1).Where(p2);
}
}
// 使用範例
var repo = new DataRepository();
repo.Add(new Employee { Name = "Alice", Dept = "IT", Salary = 80000 });
repo.Add(new Employee { Name = "Bob", Dept = "HR", Salary = 60000 });
// 單一條件
var itStaff = repo[e => e.Dept == "IT"];
// 多條件鏈式
var highPaidIT = repo[e => e.Dept == "IT", e => e.Salary > 70000];
public class DynamicQuery
{
private List _data;
public DynamicQuery(IEnumerable data) => _data = new List(data);
public IEnumerable this[params Func[] predicates]
{
get
{
IEnumerable query = _data;
foreach (var p in predicates)
query = query.Where(p);
return query;
}
}
}
// 靈活組合
var q = new DynamicQuery(products);
var result = q[p => p.Category == "Electronics", p => p.Price < 1000, p => p.InStock];
Expression> 透過運算式樹優化。IQueryable、LINQ to SQL/EF 下推篩選至資料庫。委派賦予索引器「聲明式查詢」能力,讓資料存取層 API 更直觀、彈性。結合 LINQ、運算式樹,可構建強大的動態查詢引擎。