lamda作為匿名函數,現在已經能夠出現子啊C#程序的任何可能位置,它可能作為參數為委托或其他函數復制,或者單獨作為表達式,或者承擔一些類似C++中內聯函數的一些作用承擔一些簡單計算。熟練的使用Lamda表達式能夠讓減少代碼的冗余,更快,更簡潔實現功能。
lamda表達式可采用以下任何一種:
表達式lamda,表達式作為主題
表達式位于 => 運算符右側的 lambda 表達式稱為“表達式 lambda”。 表達式 lambda 會返回表達式的結果,并采用以下基本形式:
(輸入參數) => 表達式(input-parameter)=> expression
語句 lambda,語句塊作為其主體
(輸入參數)=>{語句列表}
(input-parameters) => { <sequence-of-statements> }
任何lamda都可以轉換為委托。 如果 lambda 表達式不返回值,則可以將其轉換為 Action 委托類型之一;否則,可將其轉換為 Func 委托類型之一。
Action和Func兩者最基本的區別是:前者適合那些需要帶返回值的委托,后者適合那些不帶返回值的委托。 Func 所引用的方法接收一個或者多個參數并帶有一個返回值,Action所引用的方法接收一個或者多個參數并且沒有返回值,換句話說,你的委托所引用的方法沒有返回值,這時候適合用 Action。
ex:
private void Actionlamda() {Action<string> print = name => {Debug.Log(name);};print("Hello World");// Hello World
}private void Funclamda() {Func<int, int, int> func = (lhs, rhs) => {return lhs + rhs;};Debug.Log(func(1,1));// 2
}
lamda表達式的輸入參數
使用空括號指定零個輸入參數:
Action line = () => Console.WriteLine();
只有一個參數時可以省略括號
Func<double, double> cube = x => x * x * x;
當具有兩個或兩個以上的參數時,中間用逗號加以分割
Func<int, int, bool> testForEquality = (x, y) => x == y;
當編譯器不能明確參數類型的時候可以顯示指定參數類型
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
輸入的參數必須全部是顯示或者隱式的,否則會產生錯誤
從C#9.0開始,可以使用棄元指定lamda表達式中不使用的參數
Func<int, int, int> constant = (_, _) => 42;
為了向后兼容,如果只有一個輸入參數命名為 ,則在 lambda 表達式中, 將被視為該參數的名稱。
所以可以是下面的情況:
Func<int, int> func = (_) => _+19;
從C# 12.0開始lamda表達式參數支持默認值
var IncrementBy = (int source, int increment = 1) => source + increment;Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7
支持params 修飾參數
var sum = (params int[] values) =>
{int sum = 0;foreach (var value in values) sum += value;return sum;
};var empty = sum();
Console.WriteLine(empty); // 0var sequence = new[] { 1, 2, 3, 4, 5 };
var total = sum(sequence);
Console.WriteLine(total); // 15
params 是可變參數,用于在不清楚參數數目是使用,被修飾的參數必須是數組。
** EX:**
namespace ConsoleApp1
{class Program{static void Main(){UseParams(1, 2, 3); //既可以用任意多個intint[] myarray = new int[3] { 10, 11, 12 };UseParams(myarray); //也可以是int一維數組 UseParams2(1, 'a', new object() );}public static void UseParams(params int[] list){for (int i = 0; i < list.Length; i++){Console.WriteLine(list[i]);}Console.WriteLine();}public static void UseParams2(params object[] list){for (int i = 0; i < list.Length; i++){Console.WriteLine(list[i]);}Console.WriteLine();}}
}
lamda表達式和元組
private void LamdaText() {Func<(int, int), (int, int)> func = _ => (_.Item1*2, _.Item2 * 2) ;var num = (1,2);Debug.Log(func(num));// (2.4)
}
除了使用C# 內置的Item1,Item2在元組中也可以使用參數名參與運算
private void LamdaText() {Func<(int n1, int n2), (int, int)> func = _ => (_.n1 * 2, _.n2 * 2);var num = (1, 2);Debug.Log(func(num));// (2.4)
}
含標椎查詢語句的Lamda
Lamda可以結合Linq查詢語句,快速得到想要的結果
public override List<NodeBase> CacheNeighbors()
{return Neighbor = GridManager.Instance.Tiles.Where(t => Coords.GetDistance(t.Value.Coords) == 1).Select(t => t.Value).ToList();
}
Count 標準查詢運算符:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
Console.WriteLine($"There are {oddNumbers} odd numbers in {string.Join(" ", numbers)}");
其中包含 numbers 數組中位于 9 之前的所有元素,因為這是序列中第一個不符合條件的數字:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstNumbersLessThanSix = numbers.TakeWhile(n => n < 6);
Console.WriteLine(string.Join(" ", firstNumbersLessThanSix));
// Output:
// 5 4 1 3
下示例通過將輸入參數括在括號中來指定多個輸入參數。 此方法返回 numbers 數組中的所有元素,直至發現值小于其在數組中的序號位置的數字為止:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
Console.WriteLine(string.Join(" ", firstSmallNumbers));
// Output:
// 5 4