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

C# 2.0 泛型與內建演算法模擬(二):Predicate 委派與自訂資料結構實戰

     編輯:關於C語言

測試程式碼與執行結果

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 的元素)。

核心機制解析

Predicate<T> 委派

public delegate bool Predicate(T obj);

模擬 .NET Framework List<T>.FindAll 的回呼簽章。實際上可使用任何自訂委派作為回呼函式本體。

IEnumerable 介面與演算法通用性

透過實作 IEnumerable,任何資料結構皆可獲得強大的演算法支援 (遍歷、篩選、投影等),達到「資料結構與演算法分離」的設計目標。

MyVec<T> 類別實作回顧

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 = 優雅的演算法表達
  • 自訂集合類別只需實作 IEnumerable<T> 即可支援 LINQ 風格操作
  • 內部儲存結構可任意替換 (陣列、鏈結串列、樹等),對外介面保持一致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved