中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C# Lambda表達式

發布時間:2020-07-19 12:51:02 來源:網絡 閱讀:468 作者:guwei4037 欄目:編程語言

自C#3.0開始,就可以使用一種新語法把實現代碼賦予委托:Lambda表達式。只要有委托參數類型的地方,就可以使用Lambda表達式。

Lambda表達式的語法比匿名方法簡單。如果所調用的方法有參數,且不需要參數,匿名方法的語法就比較簡單,因為這樣不需要提供參數。

直接上一些例子,讀者可以自行運行調試。

static void Main(string[] args)
{
    //1、lambda之hello world.
    Func<string, string> lambda = param =>
    {
        return param;
    };
                                                                          
    Console.WriteLine(lambda("hello lambda."));
                                                                          
    //2、lambda之參數
    Func<double, double, double, double> cube = (double x, double y, double z) => x * y * z;
    Console.WriteLine(cube(1, 2, 3));//輸出6
                                                                          
    //更進一步,參數的類型可以省略
    Func<double, double, double, double> cude1 = (x, y, z) => x * y * z;
    Console.WriteLine(cude1(2, 4, 6));//輸出48
                                                                          
    //3、lambda之調用外部參數
    int someValue = 4;
    Func<double, double, double, double> f = (x, y, z) => x + y + z + someValue;
    Console.WriteLine(f(1, 2, 3));//1+2+3+4=10
}

在winform編程中,我們經常給某個按鈕添加Click事件,最原始的寫法是直接雙擊按鈕,生成Click事件的代碼,我們就可以直接在里面寫方法了。其實這是vs替我們做了很多工作,其中就有在designer.cs文件中,生成了 this.button1.Click += new System.EventHandler(this.button1_Click);這樣的代碼,事件要注冊才能觸發。

我們采用匿名委托的寫法,在窗體的Form_Load事件中添加如下代碼,則可以觸發button1的Click事件。

this.button1.Click += delegate(object ss, EventArgs ee)
{
    MessageBox.Show("hello,this is button1.Click event...");
};

再看看Lambda表達式的用法。

this.button1.Click += (ss, ee) =>
{
    MessageBox.Show("hello,this is button1.Click event...");
};

是不是更加簡潔?

我們再看一下,從匿名方法到Lambda簡寫的演化過程,借一張圖。

C# Lambda表達式

從這個演化過程,可以看出C#語言的發展變化過程。


下面詳細演示一下Lambda的應用實例。

首先第一個實例我們應用Lambda對一個List<Student>列表進行循環、查找、排序等操作。

首先我們提供一個實體類:

public class Student
{
    public Student(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }
                                              
    public string Name { get; set; }
    public int Age { get; set; }
}

然后我們初始化一個List,

//初始化3個Student對象
var students = new List<Student>()
{
    new Student("zhang3",18),
    new Student("li4",22),
    new Student("wang5",20)
};

//定義1個打印函數
Action<Student> print = student => Console.WriteLine(string.Concat(student.Name, ":", student.Age));

那么,我們就可以先循環輸出一下:

students.ForEach(print);//循環打印輸出

如果我們要找到年齡大于20歲的學生,可以這樣:

students.FindAll(student => student.Age > 20).ForEach(print);

進一步,我們按照學生的年齡進行排序:

students.Sort((f1, f2) => f1.Age.CompareTo(f2.Age));
students.ForEach(print);//年齡從小到大排序后輸出

現在,我們按照在students列表里再加一個學生:

var students = new List<Student>()
{
    new Student("zhang3",18),
    new Student("li4",22),
    new Student("wang5",20),
    new Student("zhao6",20)
};

現在要按照年齡進行分組,并統計出各個年齡階段的人數:

var result = students.GroupBy(x => x.Age).Select(x => string.Concat(x.Key, ":", x.Count()));//先進行分組,再進行投影
result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//循環輸出得到結果

再提供一個綜合性的例子,這是論壇里的caozhy版主提供的一個例子。用Lambda表達式實現快速排序。

Func<Func<int, int, bool>, Func<int[], int[]>> filter = x => new Func<int[], int[]>(y => y.Skip(1).Where(z => x(y[0], z)).ToArray());
Func<int[], int[]> qsort = x => x;
Func<int[], int[]> lesser = dt => filter((x, y) => y < x)(dt);
Func<int[], int[]> greater = dt => filter((x, y) => y >= x)(dt);
       
qsort = dt => dt.Length > 1
    ? qsort(lesser(dt)).Concat(new int[] { dt[0] }).Concat(qsort(greater(dt))).ToArray() : dt;
       
int[] data = { 4, 3, 1, 4, 6, 7, 5, 9, 3, 11, 1, 2, 11 };
var result = qsort(data);
result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//排完序后輸出

最后提供一下官方的C# Lambda表達式的權威資料。C# Lambda表達式


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浮梁县| 乌兰县| 天长市| 宜城市| 岳西县| 彭水| 金溪县| 亳州市| 左贡县| 苏州市| 龙州县| 贵南县| 搜索| 松潘县| 盐津县| 凤山市| 锡林浩特市| 沾化县| 绥宁县| 乐安县| 如皋市| 常德市| 大姚县| 阆中市| 恩施市| 海盐县| 伊宁市| 得荣县| 晋江市| 盖州市| 新疆| 万山特区| 仲巴县| 通州市| 宁陕县| 牡丹江市| 盐源县| 榆社县| 乐业县| 宁河县| 长治市|