国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

20.C#LINQ基礎和簡單使用(十一章11.1-11.2)

2019-11-17 02:38:12
字體:
來源:轉載
供稿:網友

20.C#LINQ基礎和簡單使用(十一章11.1-11.2)

  終于看到了第11章,之前雖然也有看過,但沒有太仔細,在工作中也偶爾會使用,但不明白其中的原理,那現在就來講講LINQ,做一做書蟲~~

  首先先了解下LINQ的三個要點:

  1. LINQ不能把非常復雜的查詢表達式轉換成一行代碼
  2. 使用LINQ不意味著你從此不再需要使用SQL
  3. LINQ不可能魔法般地讓你成為架構天才

  序列是LINQ的基礎,在你看到一個查詢表達式的時候,應該要想到它所涉及的序列:一開始總是存在至少一個序列,且通常在中間過程會轉換成其他序列,也可能和其他序列連接在一起。

 1 class Car 2 { 3     public string Owner { get; set; } 4     public double Mileage { get; set; } 5 } 6  7 class PRogram 8 { 9     static void Main(string[] args)10     {11         var list = new List<Car> {12             new Car() { Owner="a",Mileage=100},13             new Car() { Owner="b",Mileage=200},14             new Car() { Owner="c",Mileage=300},15             new Car() { Owner="d",Mileage=400},16             new Car() { Owner="e",Mileage=500},17             new Car() { Owner="f",Mileage=600}18         };19 20         var result = from e in list21                      where e.Mileage > 20022                      select e;23 24         result.ToList().ForEach(x => Console.WriteLine(x.Owner));25 26         Console.ReadKey();27 28     }29 }

  上述的表達式作用:從一個汽車序列中找到里程大于200的車。下一句代碼使用Lambda表達式來打印篩選出來的車主名。

  • 延遲執行和流處理

  上述中的查詢表達式被創建的時候,不會立刻處理數據,也不會訪問原始的汽車序列,而是在內存中生成這個查詢的表現形式,這個特點叫延遲執行。如下,在result.ToList()執行時,才會開始對序列的操作。

  • 投影

  select expression 格式的語句,稱為投影。

1 result.Where(e => e.Mileage > 200).Select(e => e);

  查詢表達式會編譯器轉譯為上面的代碼,可以看到它們是由擴展方法和Lambda表達式組成。在任何時候,參數(大多情況)都是委托類型,編譯器將用Lambda表達式作為實參,并盡量找到具有合適簽名的方法。再來看下我們的表達式

1 var result = from e in list2              where e.Mileage > 2003              select e;

  from、where、in、select為查詢表達式上下文關鍵字,e為范圍變量、list為數據源序列、select e為返回投影。再看一個返回投影的例子。

1 var result1 = from e in list2               where e.Mileage > 2003               select e.Owner;

  這里的select e.Owner,即返回每輛車主的名字,那么result1的類型為IEnumerable<string>

  • Cast方法和OfType方法
 1 class Bigtruck :Car 2 { 3     public double Volume { get; set; } 4  5 } 6  7 var list0 = new List<Car> { 8     new Car() { Owner="a",Mileage=100}, 9     new Bigtruck() { Owner="b",Mileage=200,Volume=100.1},10     new Bigtruck() { Owner="c",Mileage=300,Volume=100.2},11     new Bigtruck() { Owner="d",Mileage=400,Volume=100.3},12     new Bigtruck() { Owner="e",Mileage=500,Volume=100.4},13     new Bigtruck() { Owner="f",Mileage=600,Volume=100.5}14 };15 16 var castList = list0.Cast<Car>();17 var oftypeList = list0.OfType<Bigtruck>();18 19 Console.WriteLine(castList.Count());  //620 Console.WriteLine(oftypeList.Count());  //5

  使用Cast<T>()會把列表中元素轉換成T類型,遇到不能轉換的元素將報錯,而OfType<T>()會嘗試轉換每個元素到T類型,遇到不能轉換的元素則跳過。當顯式聲明使用范圍變量時,會在轉譯時調用Cast()方法。如

1 var result2 = from Car e in list2               select e;3 result2 = list.Cast<Car>().Select(e => e);

  表達式會轉譯為第三行的代碼。

  • 概念
  1. LINQ是以數據列表為基礎,在任何地方可能的地方進行流處理
  2. 創建一個查詢表達式,不會立刻執行,大部分操作都會延遲執行
  3. C#3的查詢表達式包括一個把表達式轉換成普通C#代碼的預處理階段,接著使用類型推斷、重載、Lambda表達式等這些常規操作來恰當地對轉換后的代碼進行編譯
  4. 在查詢表達式中聲明的變量:它們僅僅是范圍變量,通過它們你可以在查詢表達式內部一致地引用數據

  請斧正。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒲城县| 防城港市| 乡宁县| 上饶县| 民勤县| 临朐县| 昆山市| 洛扎县| 洛川县| 福州市| 山丹县| 灯塔市| 吴忠市| 铁岭县| 营口市| 天水市| 阳泉市| 娱乐| 依安县| 东阳市| 政和县| 稷山县| 乌鲁木齐市| 蒙山县| 淮阳县| 股票| 土默特左旗| 宁晋县| 五河县| 云浮市| 中超| 井研县| 甘泉县| 邵武市| 榆林市| 泰来县| 莱州市| 利津县| 怀柔区| 云霄县| 建昌县|