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

C# 3.0 Lambda 表達式實戰(二):多參數、IL 對比與命令行編譯

     編輯:關於C語言

編譯與運行環境

需 VS2005 + LINQ Preview。命令行編譯參考:


csc.exe /reference:System.Data.DLinq.dll /reference:System.Query.dll ...

ILDASM 驗證:匿名方法與 Lambda 生成相同 IL

雙擊 AnonMethod 看到編譯器生成的狀態機結構:

  • 靜態緩存委托字段 <>9__CachedAnonymousMethodDelegate1
  • 動態生成委托實例指向編譯器生成的方法 <AnonMethod>b__0
  • List.FindAll 調用委托過濾

結論:Lambda 與匿名方法編譯目標一致,Lambda 只是更簡潔的語法糖。

多參數 Lambda 表達式

語法


// 顯式類型
(int x, int y) => x + y

// 隱式類型(推薦)
(x, y) => x * y

實戰:Dictionary 多條件過濾


var clothes = new Dictionary
{
    {"Jeans", 20}, {"Shirts", 15}, {"Pajamas", 9}, {"Shoes", 9}
};

// 擴展方法 FilterBy
var shortage = clothes.FilterBy((name, count) => name == "Shoes" && count < 10);
// shortage 為 Dictionary,僅含 {"Shoes", 9}

if (shortage.Count > 0) 
    Console.WriteLine("We are short of shoes");

FilterBy 擴展方法實現


public delegate bool KeyValueFilter(K key, V value);

public static class Extensions
{
    public static Dictionary FilterBy(
        this Dictionary items, 
        KeyValueFilter filter)
    {
        var result = new Dictionary();
        foreach (var kvp in items)
            if (filter(kvp.Key, kvp.Value))
                result.Add(kvp.Key, kvp.Value);
        return result;
    }
}

總結

Lambda 表達式支持多參數(顯式/隱式類型),編譯器生成與匿名方法等價 IL。配合擴展方法,可為 Dictionary 等類型添加流式過濾能力,代碼簡潔且強類型安全。

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