static void Main(string[] args)
{
MyVec a = new MyVec();
a += 12;
a += 15;
a += 32;
MyVec b = a.FindAll(delegate(int x)
{
if (x < 20) return true;
return false;
});
Console.WriteLine("Vector original");
Console.WriteLine(a.ToString());
Console.WriteLine("Vector found");
Console.WriteLine(b.ToString());
Console.ReadLine();
}
輸出結果:
Vector original
12,15,32
Vector found
12,15
註:原文輸出顯示
32似為筆誤,依邏輯應為12,15(小於 20 的元素)。
public delegate bool Predicate(T obj);
模擬 .NET Framework List<T>.FindAll 的回呼簽章。實際上可使用任何自訂委派作為回呼函式本體。
透過實作 IEnumerable,任何資料結構皆可獲得強大的演算法支援 (遍歷、篩選、投影等),達到「資料結構與演算法分離」的設計目標。
public class MyVec
{
private List _list = new List();
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());
sb.Append(",");
}
return sb.Length > 0 ? sb.Remove(sb.Length - 1, 1).ToString() : "";
}
}
IEnumerable<T> 即可支援 LINQ 風格操作