麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設計 > 正文

16.C#初見Lambda表達式及表達式樹(九章9.1-9.3)

2019-11-17 02:39:08
字體:
來源:轉載
供稿:網(wǎng)友

16.C#初見Lambda表達式及表達式樹(九章9.1-9.3)

  在說明Lambda相關知識前,我們需要了解Lambda表達式常用于LINQ,那么我們來聊下LINQ。

  LINQ的基本功能就是創(chuàng)建操作管道,以及這些操作需要的任何狀態(tài)。這些操作表示了各種關于數(shù)據(jù)的邏輯:如何過濾、如何排序以及如何將不同的數(shù)據(jù)源連接在一起,等等。執(zhí)行委托只是LINQ的眾多能力之一。為了富有效率地使用數(shù)據(jù)庫和其他查詢引擎,我們需要以一種不同的方式來表示管道中的各個操作。這種不同的方式就可以使用Lambda表達式來表現(xiàn)。下面分別使用委托(使用匿名函數(shù))和Lambda表達式來作出同樣的事情:返回一個人的到現(xiàn)在一共活了多少天。

 1 class Person 2 { 3     public DateTime BirthDay { get; set; } 4 } 5  6 public delegate int GetLifeDays(Person p);//聲明一個委托類型 7 static void Main(string[] args) 8 { 9     Person p = new Person() { BirthDay = new DateTime(1900, 12, 17) };10 11     GetLifeDays gfd = delegate (Person x) { //實例化一個委托12         return (DateTime.Now - x.BirthDay).Days;13     };14     Console.WriteLine(gfd(p));15 16     GetLifeDays gfd1 = (Person x) => { return (DateTime.Now - x.BirthDay).Days; };17     Console.WriteLine(gfd1(p));18 19     GetLifeDays gfd2 = (Person x) => (DateTime.Now - x.BirthDay).Days;  //去除了后面的大括號,“;”為表達式結束,不是Lambda的結束20     Console.WriteLine(gfd2(p));21 22     GetLifeDays gfd3 = (x) => { return (DateTime.Now - x.BirthDay).Days; }; //讓編譯器推斷參數(shù)的類型23     Console.WriteLine(gfd3(p));24 25     GetLifeDays gfd4 = (x) =>  (DateTime.Now - x.BirthDay).Days; //同時省去參數(shù)類型和大括號26     Console.WriteLine(gfd4(p));27 28     GetLifeDays gfd5 = x => (DateTime.Now - x.BirthDay).Days; //再進一步,省去參數(shù)列表的括號29     Console.WriteLine(gfd5(p));30 31     Console.ReadKey();32 }

  上述是單一參數(shù)的各種情況,對于有兩個或多個參數(shù)的,效果是"一個到到從出生到某一天的相隔天數(shù)",某一天肯定是要大于出生那天啦。

 1 public delegate int GetDaysTo(Person p, DateTime d); 2 static void Main(string[] args) 3 { 4     Person p = new Person() { BirthDay = new DateTime(1900, 12, 17) }; 5  6     DateTime d = new DateTime(2100, 12, 12); 7     //使用匿名方法 8     GetDaysTo gdt = delegate (Person x, DateTime y) 9     {10         return (y - x.BirthDay).Days;11     };12     Console.WriteLine(gdt(p, d));13 14     GetDaysTo gdt1 = (Person x, DateTime y) => { return (y - x.BirthDay).Days; };15     Console.WriteLine(gdt1(p, d));16 17     GetDaysTo gdt2 = (Person x, DateTime y) => (y - x.BirthDay).Days;18     Console.WriteLine(gdt2(p, d));19 20     GetDaysTo gdt3 = (x, y) => (y - x.BirthDay).Days;21     Console.WriteLine(gdt3(p, d));22 23     //GetDaysTo gdt4 = x, y => (y - x.BirthDay).Days; Error24     //Console.WriteLine(gdt4(p, d));25 26     Console.ReadKey();27 }

  可以看出當參數(shù)為兩個或兩個以上時,不能省略參數(shù)列表中的括號,那也可以想像在語句兩條或兩條以上時,不能省略大括號。

  下面結合之前的知識,對一個列表使用ambda表達式進行操作。

 1 //使用集合初始化器 2 List<Person> l = new List<Person> { 3     new Person { BirthDay=new DateTime(1990,11,11)}, 4     new Person { BirthDay=new DateTime(1890,12,12)}, 5     new Person { BirthDay=new DateTime(1891,12,12)}, 6     new Person { BirthDay=new DateTime(1892,12,12)}, 7     new Person() { BirthDay=new DateTime(1870,12,12)} 8 }; 9 10 //找到大于new DateTime(1890,1,1)的人11 var result0 = l.FindAll(x => x.BirthDay > new DateTime(1890, 1, 1));12 13 //按年齡從小到大排序14 l.Sort((x, y) => x.BirthDay > y.BirthDay ? -1 : 1);15 foreach (var e in l)16 {17     Console.WriteLine((DateTime.Now - e.BirthDay).Days);18 }19 20 //循環(huán)打印每個人的出生天數(shù),效果和上面的foreach一樣21 l.ForEach(x => Console.WriteLine((DateTime.Now - x.BirthDay).Days));22 23 //找到BirthDay=new DateTime(1890,12,12)的人24 var result1 = l.Find(x => x.BirthDay == new DateTime(1890, 12, 12));

  接下來,我們來說下表達式樹,.NET3.5的表達式提供了一種抽象的方式將一些代碼表示成一個對象樹,表達式樹主要用于LINQ。System.Linq.ExPRessions命名空間包含了代表表達式的各個類,它們都繼承于Expression,一個抽象的主要包含一些靜態(tài)工廠方法的類,這些方法用于創(chuàng)建其它表達類的實例。

  Expression類包含兩個屬性:

  1. Type屬性代表表達式求值后.NET類型,可把它視為一個返回類型。例如,一個表達式要獲取一個字符串的長度,則該表達式的類型為int。
  2. NodeType屬性返回所代表的表達式的種類。它是ExpressionType枚舉的成員。
1 Expression first = Expression.Constant(5);2 Expression result = Expression.Add(first, first);3 Console.WriteLine(result);

  斷點對象各屬性

  上圖分別為first對象和result對象的各屬性值。

  • 將表達式樹編譯成委托

  LambdaExpression是從Expression派生的類型之一。泛型類Expression<TDelegate>又是從LambdaExpression中派生。Expression和Expression<TDelegate>區(qū)別在于泛型類以靜態(tài)類的方法標識了它是什么各類的表達式,也就是說,它確定了返回類型和參數(shù)。很顯然,這是用TDelegate類型參數(shù)來表示的,它必須是一個委托類型。LambdaExpression有一個Compile方法能創(chuàng)建恰當類型的委托。Expression<TDelegate>也有一個同名的方法 ,但它靜態(tài)類型化返回TDelegate類型的委托。如:

1 Expression first = Expression.Constant(5);2 Expression result = Expression.Add(first, first);3 Func<int> add = Expression.Lambda<Func<int>>(result).Compile();4 Console.WriteLine(add()); //10
  • 將C#Lambda表達式轉換為表達式樹

  Lambda表達式能顯式或隱式地轉換為恰當?shù)奈袑嵗欢@些并非唯一能進行的轉換,還可以要求編譯器通過你的Lambda表達式構建一個表達式樹,在執(zhí)行時創(chuàng)建Expression<TDelegate>的一個實例。如

1 Expression<Func<int>> re = () => 5;2 Func<int> add0 = re.Compile();3 Console.WriteLine(add0());

  后面的那些內容真心太復雜了,自己實在理解不了,而且日常使用中也沒有使用過,沒有底氣聊這個話題,想深入的朋友可以自己深入去了解,這里就做罷了吧。

  請斧正。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲影院在线 | 久久精品网 | 黄色网页在线观看 | 久综合 | 一区二区三区精品国产 | 久久久日韩av免费观看下载 | 黄色片视频在线观看 | 久久久久久久久久久av | 一级毛片电影网 | 九九热在线免费观看视频 | 免费久久精品 | 日本黄色大片免费 | www.91成人| 98色视频 | 欧美性猛交xxx乱大交3蜜桃 | 美女视频黄视大全视频免费网址 | freexxx69性欧美hd | 国产一区视频观看 | 国产99精品在线 | 国产一区二区欧美精品 | 91在线色| 久久久www成人免费精品 | 日本最新免费二区三区 | 羞羞视频免费视频欧美 | 在线观看视频毛片 | 麻豆视频观看 | 深夜毛片免费看 | 91精品国产乱码久久久久 | 91成人天堂久久成人 | 免费久久精品 | 成人免费网站在线观看视频 | 亚洲码无人客一区二区三区 | 国产成人高清成人av片在线看 | www.com香蕉 | 久久精品在线免费观看 | 性欧美极品xxxx欧美一区二区 | 色综合欧美 | 久草成人在线 | 欧产日产国产精品99 | 国产不卡av在线 | 九九热视频这里只有精品 |