C#重溫—Lambda表達式

Lambda表達式簡介:

MSDN定義:Lambda 表達式是一種可用于創(chuàng)建委托或表達式目錄樹類型的匿名函數(shù)。

介紹

1.lambda表達式是匿名函數(shù)君旦,只不過長得不太像而已,可以看成是進化版嘲碱。
2.lambda表達式是用來創(chuàng)建委托或者目錄樹的匿名函數(shù)

使用場景:

可以在需要委托值的任何地方(也就是在可以使用匿名方法的任何地方)使用這些表達式金砍。


Lambda表達式的演化.png

我的理解:

其實Lambda表達式就是匿名方法。
其中使用Lambda表達式來創(chuàng)建委托實例麦锯,我們卻沒有指出創(chuàng)建的委托類型恕稠,其中編譯器會幫助我們?nèi)ネ茢辔蓄愋停瑥亩喕覀儎?chuàng)建委托類型所需要的代碼扶欣,從而更加簡潔鹅巍。
所以Lambda表達式可以總結(jié)為——它是在匿名方法的基礎(chǔ)上千扶,再進一步地簡化了創(chuàng)建委托實例所需要的代碼。
匿名方法可以簡明的忽略參數(shù)昆著,但Lambda表達式不具備這一特性县貌。

Button btn=new Button();
Btn.Text=“click me”;
Btn.Click+=delegate{console.WriteLine(“LogPlain”);};//忽略了我們經(jīng)常使用的參數(shù)delegate(object sender,EventArgs e){…}

Lambda表達式使用演示

static void Main(string[] args)
{
    // Lambda表達式的演變過程
    // 下面是C# 1中創(chuàng)建委托實例的代碼
    Func<string, int> delegatetest1 = new Func<string, int>(Callbackmethod);          
    //                                  ↓
    // C# 2中用匿名方法來創(chuàng)建委托實例,此時就不需要額外定義回調(diào)方法Callbackmethod
    Func<string, int> delegatetest2 = delegate(string text)
    {
         return text.Length;
    };
    //                                  ↓
    // C# 3中使用Lambda表達式來創(chuàng)建委托實例
    Func<string, int> delegatetest3 = (string text) => text.Length;
    //                                 ↓
    // 如果Lambda表達式只需一個參數(shù)凑懂,并且那個參數(shù)可以隱式指定類型時煤痕,
    // 此時可以把圓括號也省略,簡化為:
   Func<string, int> delegatetest = text => text.Length;

    // 調(diào)用委托
    Console.WriteLine("使用Lambda表達式返回字符串的長度為: " + delegatetest("learning hard"));
    Console.Read();
}

/// <summary>
/// 回調(diào)方法
/// 如果使用了Lambda表達式和匿名函數(shù),此方法就不需要額外定義
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private static int Callbackmethod(string text)
{
    return text.Length;
}

Lambda結(jié)合Action和Func的使用

Action<string> action = (str) => Console.WriteLine("Task={0}, str={1}, Thread={2}", Task.CurrentId, str, Thread.CurrentThread.ManagedThreadId);

Func<int, int> negate =(n) =>{
     Console.WriteLine("Task={0}, n={1}, Thread={2}", Task.CurrentId, n, Thread.CurrentThread.ManagedThreadId);
     return -n;
};

Task<int>.Factory.StartNew(() => negate(6))
                 .ContinueWith(f => action("x"))
                 .Wait();

Lambda表達式的使用

主要的是在Linq表達式的使用接谨,以及對擴展方法上的運用等
例如:

List list=new List();
list.Add(2);
list.Add(3);
list.Where(x=>x%2==0);
where方法其實就是一個擴展方法
 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

總結(jié)

  1. 匿名函數(shù)不等于匿名方法摆碉,匿名函數(shù)包含了匿名方法和lambda表達式這兩種概念。
    匿名函數(shù):{匿名方法脓豪,lambda表達式}

2.lambda作為表達式巷帝,可以被C#編譯器轉(zhuǎn)換為委托,也可以被編譯器轉(zhuǎn)換為表達式樹扫夜,匿名方法只能轉(zhuǎn)換為委托楞泼。
兩者的共通點是都能被編譯器轉(zhuǎn)換成為委托,lambda表達式能完成幾乎所有匿名方法能完成的事笤闯。

延伸

Linq查詢操作符

string[] words = { "zero","one", "two", "three", "four" };
int[] numbers = { 0, 1, 2, 3, 4 };

1.聚合

numbers.Sum();
numbers.Average();
numbers.Count();
numbers.LongCount(x => x % 2 == 0);
words.Min();
words.Max();
numbers.Aggregate((a, b) => (a + b));

2.鏈接

numbers.Concat(new[] { 2, 3, 4, 5, 6 });

3.轉(zhuǎn)換

words.Cast<string>()  //遍歷時遇到轉(zhuǎn)換失敗的地方堕阔,會拋出異常
words.OfType<string>()
numbers.ToArray();
numbers.ToList();
words.ToDictionary(w => w.Substring(0, 2));
numbers.Concat(new[] { 2, 3, 4, 5, 6 });

4.元素操作符

words.ElementAt(2);
words.ElementAtOrDefault(10);
words.First();
words.First(w => w.Length == 3);
words.First(w => w.Length == 10); //異常:沒有匹配的元素
words.FirstOrDefault (w => w.Length == 10); //null
words.Last(); //"four“
words.Single(); //異常:不止一個元素
words.SingleOrDefault(); //異常:不止一個元素
words.Single(word => word.Length == 5); //“three“   返回唯一元素
words.Single(word => word.Length == 10); //異常:沒有匹配的元素
words.SingleOrDefault(w => w.Length == 10); //null   返回唯一元素

5.相等操作

words.SequenceEqual(new[]{“ZERO”,“ONE”,“TWO”,“THREE”,“FOUR”},StringComparer.OrdinalIgnoreCase);

6.生成

numbers.DefaultIfEmpty(); //0, 1, 2, 3, 4
Enumerable.Range(0, 100);
Enumerable.Repeat(25, 2);//生成包含重復(fù)值的序列
Enumerable.Empty<int>();//生成任意類型的空序列

7.分組

words.GroupBy(word => word.Length);

8.連接

words.Join(allStrings, name => name[0], color => allStrings[0],(name, color) => name + " - " + color);
words.GroupJoin

9.分部

words.Take(2); //"zero", "one"
words.Skip(2); //"two","three", "four"
words.TakeWhile(word => word.Length <= 4); //"zero", "one", "two"
words.SkipWhile(word => word.Length <= 4); //"three","four“

10.投影

words.Select(word => word.Length);// 4, 3, 3, 5, 4
words.Select((word, index) => index.ToString() + ": " + word); //"0: zero", "1: one", "2: two","3: three", "4: four"
words.SelectMany(word => word.ToCharArray());//'z', 'e', 'r', 'o', 'o', 'n', 'e', 't', 'w', 'o', 't','h', 'r', 'e', 'e', 'f', 'o', 'u', 'r'

11.數(shù)量

words.All(word => word.Length > 3); //false("one"和"two"的確包含3個字母)
words.All(word => word.Length > 2); //true
words.Any(); //true(序列不為空)
words.Any(word => word.Length == 6); //false(沒有6個字母的單詞)
words.Any(word => word.Length == 5); //true("three"滿足這個條件)
words.Contains("FOUR"); //false
words.Contains("FOUR",StringComparer.OrdinalIgnoreCase); //true

12.過濾

 words.Where(word => word.Length > 3); //"zero", "three", "four“

13.基于集的操作符

"abbc".Distinct(); //"a", "b", "c"
"abbc".Intersect("cd"); //"c"
"abbc".Union("cd");//"a", "b", "c", "d"
"abbc".Except("cd"); //"a", "b"
"cd".Except("abc"); //"d“

14.排序

words.OrderBy(word => word);
words.Reverse();
words.OrderByDescending(word => word.Length);

有部分內(nèi)容是摘抄的深入淺出C#,附上PDF下載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颗味,一起剝皮案震驚了整個濱河市超陆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浦马,老刑警劉巖时呀,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晶默,居然都是意外死亡谨娜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門磺陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧预,“玉大人,你說我怎么就攤上這事仅政。” “怎么了盆驹?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵圆丹,是天一觀的道長。 經(jīng)常有香客問我躯喇,道長辫封,這世上最難降的妖魔是什么硝枉? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮倦微,結(jié)果婚禮上妻味,老公的妹妹穿的比我還像新娘。我一直安慰自己欣福,他們只是感情好责球,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拓劝,像睡著了一般雏逾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郑临,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天栖博,我揣著相機與錄音,去河邊找鬼厢洞。 笑死仇让,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躺翻。 我是一名探鬼主播丧叽,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼获枝!你這毒婦竟也來了蠢正?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤省店,失蹤者是張志新(化名)和其女友劉穎嚣崭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懦傍,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雹舀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粗俱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片说榆。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寸认,靈堂內(nèi)的尸體忽然破棺而出签财,到底是詐尸還是另有隱情,我是刑警寧澤偏塞,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布唱蒸,位于F島的核電站,受9級特大地震影響灸叼,放射性物質(zhì)發(fā)生泄漏神汹。R本人自食惡果不足惜庆捺,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屁魏。 院中可真熱鬧滔以,春花似錦、人聲如沸氓拼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽披诗。三九已至撬即,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呈队,已是汗流浹背剥槐。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪摧,地道東北人粒竖。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像几于,于是被迫代替她去往敵國和親蕊苗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容