哈哈,隔了一個星期,再怎麼樣都要發一篇,要多看書啊,書不能停~~~
where子句的語法格式如下:where 過慮表達式
例子:新建一個珠寶類,如下:
1 class Jewellery 2 { 3 /// <summary> 4 /// 珠寶類型 5 /// <list type="Ring">戒指</list> 6 /// <list type="Necklace">項鏈</list> 7 /// <list type="Bracelet">手鏈</list> 8 /// </summary> 9 public enum JewelleryType 10 { 11 Ring, 12 Necklace, 13 Bracelet 14 } 15 /// <summary> 16 /// 當前珠寶狀態 17 /// <list type="Stock">存貨</list> 18 /// <list type="Repair">修理中</list> 19 /// <list type="Sold">已售出</list> 20 /// </summary> 21 public enum JewelleryState 22 { 23 Stock, 24 Repair, 25 Sold 26 } 27 public JewelleryType Type { get; set; } 28 public double Price { get; set; } 29 public JewelleryState State { get; set; } 30 }
再我們使用一個List來做容器,通過LINQ來過慮。
1 List<Jewellery> list = new List<Jewellery>() 2 { 3 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Repair,Price=100 }, 4 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=200 }, 5 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Stock,Price=300 }, 6 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=400 }, 7 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Stock,Price=500 }, 8 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Repair,Price=600 } 9 }; 10 11 //查找價格大於300的手鏈 12 var result = from item in list 13 where item.Price > 300 && item.Type == Jewellery.JewelleryType.Bracelet 14 select item; 15 //轉換為list.Where(item => item.Price > 300).Where(item => item.Type == Jewellery.JewelleryType.Bracelet); 16 Console.WriteLine(result.Count()); 17 18 //記錄當前正在修理中的珠寶總值 19 var result1 = (from item in list 20 where item.State == Jewellery.JewelleryState.Repair 21 select item).Sum(item => item.Price); 22 //轉換為list.Where(item => item.State == Jewellery.JewelleryState.Repair).Sum(item => item.Price); 23 Console.WriteLine(result1); 24 25 Console.ReadKey();
1 var resutl2 = from item in list 2 select item; 3 //這個就是所謂的退化表達式,編譯器會故意生成一個對Select方法的調用,即使它什麼都沒有做,但result2和list有很大的不同, 4 //兩個序列返回的數據是相同的,但是Select方法的結果只是數據項的序列,而不是數據源本身。查詢表達式的結果和源數據永遠不會是同一個對象 5 //當有其它的操作的時候,就不用為編譯器保留一個"空操作"Select子句
1 //按價格排序,從大到小 2 var resutl3 = from item in list 3 orderby item.Price descending 4 select item; 5 //轉換為list.OrderByDescending(item => item.Price);
1 //先用價格再按狀態排序 2 var result4 = from item in list 3 orderby item.Price, item.State 4 select item;
let子句只不過引入一個新的范圍變量,它的值是基於其它范圍變量,語法格式:let 標識符 = 表達式
1 //貨品是用RMB的,現在使用HK來記錄,使用投影返回匿名對象的序列 2 var result5 = from item in list 3 let hk = item.Price / 0.8 4 select new { hk = hk, item = item };
let操作符對一個表達式進行求值,並引入新的范圍變量
相應於數據庫中的概念,使用兩張表,這裡是使用兩個序列,通過匹配兩者之間的數據行來創建結果。
內連接涉及兩個序列。一個鍵選擇器表達式應用於第1個序列的每一個元素,另外一個鍵選擇器(可能完全不同)應用於第二個序列的每一個元素。連接的結果是一個包含所有配對元素的序列,配對的規則是第1個元素的鍵與第2個元素的鍵相同。
連接的格式:join 右邊序列元素 in 右邊序列
on 左邊序列元素的key equals 右邊序列元素的key
1 /// <summary> 2 /// 用於存放珠寶的盒子 3 /// </summary> 4 class Box 5 { 6 /// <summary> 7 /// 盒子有一個珠寶類型的屬性,與要放的珠寶類型一致 8 /// </summary> 9 public Jewellery.JewelleryType jewelleryType { get; set; } 10 public string BoxName { get; set; } 11 }
1 //打印每個珠寶存放的盒子,珠寶的狀態要是存貨 2 var result6 = from box in boxList 3 join item in list 4 on box.jewelleryType equals item.Type 5 where item.State == Jewellery.JewelleryState.Stock 6 select new { BoxName = box.BoxName, Price = item.Price }; 7 8 result6.ToList().ForEach(item => Console.WriteLine("位置:" + item.BoxName + ";" + "價格:" + item.Price));
結果如下
可見在box1中放了一件價格為500的珠寶,在box3中放著一個價格為300的珠寶。這裡作為兩個序列的key的是珠寶的類型Jewellery.JewelleryType
請斧正。