c# C#Lambda表達式:為什麼我應該使用它們?





7 Answers

匿名函數和表達式對於一次性方法非常有用,它不會從創建完整方法所需的額外工作中受益。

考慮這個例子:

 string person = people.Find(person => person.Contains("Joe"));

 public string FindPerson(string nameContains, List<string> persons)
 {
     foreach (string person in persons)
         if (person.Contains(nameContains))
             return person;
     return null;
 }

這些在功能上是等同的。

c# c#-3.0 lambda

我已經快速閱讀了Microsoft Lambda Expression文檔。

雖然這樣的例子幫助我更好地理解:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

不過,我不明白為什麼這是一種創新。 這只是一個方法,當“方法變量”結束時就會死掉,對嗎? 為什麼我應該使用這個而不是真正的方法?




例如,Lambda清理了C#2.0的匿名委託語法

Strings.Find(s => s == "hello");

這是在C#2.0中完成的:

Strings.Find(delegate(String s) { return s == "hello"; });

在功能上,他們做的是完全相同的事情,它只是一個更簡潔的語法。




微軟為我們提供了一種更簡潔,更便捷的方式來創建名為Lambda表達式的匿名代理。 但是,對這個聲明的表達部分沒有太多關注。 微軟發布了一個完整的命名空間System.Linq.Expressions ,它包含了基於lambda表達式創建表達式樹的類。 表達式樹由表示邏輯的對象組成。 例如,x = y + z是一個表達式,可能是.Net中表達式樹的一部分。 考慮以下(簡單)示例:

using System;
using System.Linq;
using System.Linq.Expressions;


namespace ExpressionTreeThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<int, int>> expr = (x) => x + 1; //this is not a delegate, but an object
            var del = expr.Compile(); //compiles the object to a CLR delegate, at runtime
            Console.WriteLine(del(5)); //we are just invoking a delegate at this point
            Console.ReadKey();
        }
    }
}

這個例子很簡單。 我相信你在想:“這是無用的,因為我可以直接創建委託,而不是創建表達式並在運行時編譯它。” 你會是對的。 但是這為表達樹提供了基礎。 Expressions命名空間中有許多可用的表達式,您可以構建自己的表達式。 我想你可以看到,當你不知道算法在設計或編譯時應該是什麼時,這可能是有用的。 我在某個地方看到了使用它編寫科學計算器的例子。 您也可以將其用於Bayesian系統或遺傳編程 (AI)。 在我的職業生涯中,我不得不編寫類似Excel的功能,允許用戶輸入簡單的表達式(添加,刪除等)來操作可用數據。 在pre.Net 3.5中,我不得不求助於C#外部的某種腳本語言,或者必須在反射中使用代碼發射功能來即時創建.Net代碼。 現在我會使用表達式樹。




lambda表達式就像代替委託實例寫入的匿名方法。

delegate int MyDelagate (int i);
MyDelagate delSquareFunction = x => x * x;

考慮lambda表達式x => x * x;

輸入參數值是x(在=>的左側)

函數邏輯是x * x(在=>的右側)

lambda表達式的代碼可以是語句塊而不是表達式。

x => {return x * x;};

注意: Func是一個預定義的泛型委託。

    Console.WriteLine(MyMethod(x => "Hi " + x));

    public static string MyMethod(Func<string, string> strategy)
    {
        return strategy("Lijo").ToString();
    }

參考

  1. 代表和接口如何互換使用?



很多時候,你只能在一個地方使用這個功能,所以製作一個方法會讓整個班級變得混亂。




這是一種採取小操作的方式,並將其與使用位置非常接近(與聲明接近其使用點的變量不同)。 這應該讓你的代碼更具可讀性。 通過對錶達式進行匿名處理,如果某個人在其他地方使用了該功能並將其修改為“增強”該功能,那麼對於某人破壞客戶端代碼而言,也會使其變得更加困難。

同樣,為什麼你需要使用foreach? 您可以使用plain for循環執行foreach中的所有操作,也可以直接使用IEnumerable。 答:你不需要它,但它使你的代碼更具可讀性。




這也許是為什麼使用lambda表達式的最好解釋 - > https://youtu.be/j9nj5dTo54Q

總之,這是為了提高代碼的可讀性,通過重複使用而不是複制代碼來減少錯誤的機會,並利用幕後的優化。




Related