C#從使用“l(fā)ambda”绷耍、“l(fā)inq”到引入封裝思想

Lambda的前世今生
Lambda的本質(zhì)是一個(gè)方法,多播委托中是不能把Lambda表達(dá)式-=祈匙,因?yàn)長(zhǎng)ambda表達(dá)式其實(shí)是一個(gè)方法忽刽,不同的lambda表達(dá)式就是不同的方法。
.Netframework1.0/1.1時(shí)代

NoReturnNoPara method = new NoReturnNoPara(DoNothing);
method .Invoke();

.NetFramework2.0時(shí)代夺欲,匿名方法增加了一個(gè)delegate關(guān)鍵字跪帝,可以訪(fǎng)問(wèn)到參數(shù)以外的局部變量

NoReturnWithPara method = new NoReturnWithPara(delegate (int id, string name)
{
      Console.WriteLine($"{id} {name}...");
      Console.WriteLine(i);
});
method.Invoke(123, "Test");

.NetFramework3.0時(shí)代,去掉delegate關(guān)鍵字些阅,添加一個(gè)=> "goes to"

NoReturnWithPara method = new NoReturnWithPara ((int id,string name)=>
{
      Console.WriteLine($"{id} {name}...");
      Console.WriteLine(i);
});
method.Invoke(123, "Test");

.NetFramework3.0 后期,去掉了匿名方法的參數(shù)類(lèi)型

NoReturnWithPara method = new NoReturnWithPara((id,name)=>
{
      Console.WriteLine($"{id} {name}...");
      Console.WriteLine(i);
});
method.Invoke(123, "Test");

** Linq使用**
相信在日常的開(kāi)發(fā)中伞剑,大家在對(duì)集合進(jìn)行處理事都使用過(guò)Linq,但不知道大家有沒(méi)有究其Linq的本質(zhì)呢?
下面我將使用代碼的方式將"List.Where()"進(jìn)行拆解開(kāi):

public static class MethodExtension
{
      public static IEnumerable<T> CustomWhere<T>(this IEnumerable<T> resource, Func<T, bool> func) where T : class
      {
                List<T> list = new List<T>();
                foreach (var item in resource)
                {
                       if (func.Invoke(item))
                      {
                           list.Add(item);
                       }
                }
                return list;
      }
}
public class App
{
      public static void Main(string[] args)
     { 
             //初始化集合
             List<string> strList = new List<string>();
             //定義函數(shù)體
             Func<string,bool> func = (s=>{return s.Length > 10};);
            //使用上述的擴(kuò)展方法
             strList.CustomWhere(func);
            //進(jìn)一步演化得到
             strList.CustomWhere(s =>s.Lenght >10);
     }
}

由上面的拆解發(fā)現(xiàn)市埋,其實(shí)Linq就是將我們可變的邏輯進(jìn)行封裝成委托來(lái)當(dāng)作參數(shù)進(jìn)行傳遞黎泣,而不變的邏輯封裝成方法體來(lái)接收可變的邏輯參數(shù),而這種思想也就是早期微軟特別推崇的“封裝思想”缤谎。
了解了“Linq”的基本原理后抒倚,那就在來(lái)看一下Linq中的其他封裝方法:

//Select--投影
var list = studentList.Where<Student>(s => s.Age < 30)
                 .Select(s => new
                  {
                        IdName = s.Id + s.Name,
                        ClassName = s.ClassId == 2 ? "2班" : "其他班"
                   });
 foreach (var item in list)
 {
        Console.WriteLine("Name={0}  Age={1}", item.ClassName, item.IdName); 
 }
//OrderBy,OrderByDescending坷澡,Skip托呕,Take
 var list = studentList.Where<Student>(s => s.Age < 30)//條件過(guò)濾
                                     .Select(s => new//投影
                                     {
                                         Id = s.Id,
                                         ClassId = s.ClassId,
                                         IdName = s.Id + s.Name,
                                         ClassName = s.ClassId == 2 ? "2班" : "其他班"
                                     })
                                     .OrderBy(s => s.Id)//排序
                                     .OrderByDescending(s => s.ClassId)//倒排
                                     .Skip(2)//跳過(guò)幾條
                                     .Take(3)//獲取幾條
                                     ;
foreach (var item in list)
{
      Console.WriteLine($"Name={item.ClassName}  Age={item.IdName}");
}
//GroupBy
var list = studentList.GroupBy(s => s.ClassId).Select(sg => new
{
      key = sg.Key,
      maxAge = sg.Max(t => t.Age)
});
foreach (var item in list)
{
      Console.WriteLine($"key={item.key}  maxAge={item.maxAge}");
}
//Join
var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new
{
     Name = s.Name,
     CalssName = c.ClassName
});
foreach (var item in list)
{
      Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
//left Join
var list = from s in studentList
                           join c in classList on s.ClassId equals c.Id
                           into scList
                           from sc in scList.DefaultIfEmpty()//
                           select new
                           {
                               Name = s.Name,
                               CalssName = sc == null ? "無(wú)班級(jí)" : sc.ClassName//c變sc,為空則用
                           };
foreach (var item in list)
{
        Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末频敛,一起剝皮案震驚了整個(gè)濱河市镣陕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻政,老刑警劉巖呆抑,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汁展,居然都是意外死亡鹊碍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)食绿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侈咕,“玉大人,你說(shuō)我怎么就攤上這事器紧∫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵铲汪,是天一觀(guān)的道長(zhǎng)熊尉。 經(jīng)常有香客問(wèn)我罐柳,道長(zhǎng),這世上最難降的妖魔是什么狰住? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任张吉,我火速辦了婚禮,結(jié)果婚禮上催植,老公的妹妹穿的比我還像新娘肮蛹。我一直安慰自己,他們只是感情好创南,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布伦忠。 她就那樣靜靜地躺著,像睡著了一般稿辙。 火紅的嫁衣襯著肌膚如雪昆码。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天邓深,我揣著相機(jī)與錄音未桥,去河邊找鬼。 笑死芥备,一個(gè)胖子當(dāng)著我的面吹牛冬耿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萌壳,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亦镶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袱瓮?” 一聲冷哼從身側(cè)響起缤骨,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尺借,沒(méi)想到半個(gè)月后绊起,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燎斩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年虱歪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅表。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笋鄙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怪瓶,到底是詐尸還是另有隱情萧落,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站找岖,受9級(jí)特大地震影響陨倡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宣增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一玫膀、第九天 我趴在偏房一處隱蔽的房頂上張望矛缨。 院中可真熱鬧爹脾,春花似錦、人聲如沸箕昭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)落竹。三九已至泌霍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間述召,已是汗流浹背朱转。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留积暖,地道東北人藤为。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像夺刑,于是被迫代替她去往敵國(guó)和親缅疟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359