首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 泛型與內建演算法模擬(一):匿名方法、Predicate 與 Closure 設計模式

     編輯:關於C語言

動機:為自訂資料結構提供內建演算法支援

.NET 內建 List<T>.FindAll 讓篩選操作極為簡潔:

List found = thelib.FindAll(delegate(Book book) {
    return book.ISBN.StartsWith("...");
});

若自訂 Library 類別使用特殊資料結構 (非 List<T>),能否提供相同語法?答案是肯定的。

核心機制:Predicate<T> 與 Closure

FindAll 使用的委派原型

public delegate bool Predicate(T obj);

這本質上是註冊一個「搜尋回呼」,配合內部遍歷機制,形成 Closure (閉包) 模式:演算法邏輯固定,判斷條件外部注入。

自訂演算法結構實作:MyVec<T>

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() : "";
    }
}

關鍵設計點

  1. 運算子多載:提供直觀的加入語法
  2. Predicate<T> 參數:標準化回呼介面,相容匿名方法與 Lambda
  3. foreach 遍歷:依賴 IEnumerable 隱含介面,解耦儲存結構
  4. 回傳同類型:FindAll 回傳 MyVec<T>,支援鏈式操作

延伸應用

同樣模式可實作 Find、Exists、TrueForAll、ConvertAll、Sort 等演算法,構建完整的集合演算法庫。下篇將展示更複雜的資料結構實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved