C#中的Lambda表達式與委托的比較及用法
Lambda表達式
"Lambda表達式"是一個匿名函數,是一種高效的類似于函數式編程的表達式,Lambda簡化了開發中需要編寫的代碼量。它可以包含表達式和語句,并且可用于創建委托或表達式目錄樹類型,支持帶有可綁定到委托或表達式樹的輸入參數的內聯表達式。所有Lambda表達式都使用Lambda運算符=>,該運算符讀作"goes to"。Lambda運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。Lambda表達式x => x * x讀作"x goes to x times x"。可以將此表達式分配給委托類型
lambda表達式參數的輸入:
1.0個參數:[]=>expr
2.一個參數:param=>expr
3.多個參數:(param-list)=>expr
例子
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Lambda表達式用法解析
委托:
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Lambda表達式
delegate int Test(int a);
static void Main(string[] args)
{
// Test gwl = JieZhang;
Test gwl = p => p + 10;
Console.WriteLine(gwl(10) + ""); //打印20,表達式的應用
Console.ReadKey();
}
多參數的Lambda表達式
delegate int Test(int a,int b);
static void Main(string[] args)
{
Test gwl = (p,z) => z-(p + 10);
Console.WriteLine(gwl(10,100) + ""); //打印80,z對應參數b,p對應參數a
Console.ReadKey();
}
以Lambda為主體的運算
delegate int Test(int a,int b);
static void Main(string[] args)
{
Test gwl = (p, z) =>
{
int zuidixiaofei = 10;
if (p < zuidixiaofei)
{
return 100;
}
else
{
return z - p - 10;
}
};
Console.WriteLine(gwl(10,100) + ""); //打印80,z對應參數b,p對應參數a
Console.ReadKey();
}
Func<T>委托
T 是參數類型,這是一個泛型類型的委托,用起來很方便的。
static void Main(string[] args)
{
Func<int, string> gwl = p => p + 10 + "--返回類型為string";
Console.WriteLine(gwl(10) + ""); //打印‘20--返回類型為string’,z對應參數b,p對應參數a
Console.ReadKey();
}
說明:我們可以看到,這里的p為int 類型參數, 然而lambda主體返回的是string類型的。
再上一個例子
static void Main(string[] args)
{
Func<int, int, bool> gwl = (p, j) =>
{
if (p + j == 10)
{
return true;
}
return false;
};
Console.WriteLine(gwl(5,5) + ""); //打印‘True’,z對應參數b,p對應參數a
Console.ReadKey();
}
說明:從這個例子,我們能看到,p為int類型,j為int類型,返回值為bool類型。
看完上面兩個例子,相信大家應該明白啦Func<T>的用法:多個參數,前面的為委托方法的參數,最后一個參數,為委托方法的返回類型。
Lambda在C++ sort()排序函數中的應用
首先定義一個ListNode鏈表
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
如何定義鏈表按照首節點進行排序的規則呢
用cmp方法
vector<ListNode*>sList;
struct cmp
{
bool operator() (const ListNode* a, const ListNode* b)
{
return a->val > b->val;
}
};
sort(sList.begin(), sList.end() ,cmp);
Lambda表達式
sort(sList.begin(), sList.end() ,
[](const ListNode* a, const ListNode* b) { return a->val > b->val; });