說起匿名型別,我們都知道這玩意都是為linq而生,而且匿名型別給我們帶來的便利性大家在實戰中應該都體會到了,特別適合於一次性使用,臨時
使用這些場景,雖然說是匿名型別,也就是說是有型別的,只是匿名了而已,對吧,這篇我們就來探索下匿名型別到底和linq有多大關係呢???
一:select中的匿名型別
這個我想大家用的是最多的,畢竟你select之後需要把原始資料重塑成另一種形狀展示出來,不信你看嘛!!!
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var strs = new string[] { "as", "is", "two", "spa" }; 6 7 var query = from str in strs 8 let temp = str.ToUpper() 9 where temp.Contains("S") 10 select new { Word = temp, Length = temp.Length }; 11 } 12 }
從上面的程式碼中,你可以看到,原來只是一個string陣列,經過linq整合之後就成了一個IEnumerable集合的匿名類集合,並且成功的把每個字串大寫化
並且統計每個字串的長度,也體現了匿名型別的臨時性。
二:JavaScriptSerializer 中的匿名型別
這個型別我想大家都清楚,不過效能更高的方式應該是用JsonConvert吧,但這個不是本篇討論的話題,我們重點來看看匿名型別的Json序列化能給我們
帶來多大的便利性,比如下面這樣:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 JavaScriptSerializer serializer = new JavaScriptSerializer(); 6 7 var json = serializer.Serialize(new { Message = "ok", Code = 20001 }); 8 } 9 }
從上圖中可以看到,其實我並沒有顯式的定義一個model,而是定義了一個匿名的model,這個model具有Message和Code欄位,這樣我們就可以直接序
列化了,是不是很方便呢??
三:linq中的多鍵關聯
當我們用linq做兩個集合的關聯時,會用到on...equals...或者就是兩個from...from....where 解決,而且通常情況下只有一個鍵的關聯,比如下面這樣:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var productList = new List<Product>() 6 { 7 new Product() { ProductID=1, ProductName="傳奇少女2016春秋新款韓版寬鬆襯衫連衣裙棉麻質感防曬外套風衣女", SupplierID=1 }, 8 new Product() { ProductID=2, ProductName="襯衫女長袖2016春裝新款女裝韓範春夏上衣襯衣春季百搭長袖打底衫", SupplierID=1 }, 9 new Product() { ProductID=3, ProductName="雪紡襯衫女長袖棉立方2016初春新品女裝上衣手風琴褶雪紡衫襯衣", SupplierID=2 }, 10 }; 11 12 var orderList = new List<Order> 13 { 14 new Order() { OrderID=1000001, OrderName="第一個訂單", ProductID=1, SupplierID=1 }, 15 new Order() { OrderID=1000002, OrderName="第二個訂單", ProductID=3, SupplierID=2 }, 16 new Order() { OrderID=1000003, OrderName="第三個訂單", ProductID=2, SupplierID=2 } 17 }; 18 19 var query = from p in productList 20 join o in orderList 21 on p.ProductID equals o.ProductID 22 select new 23 { 24 ProductID = p.ProductID, 25 ProductName = p.ProductID, 26 OrderID = o.OrderID, 27 OrderName = o.OrderName, 28 SupplierID = p.SupplierID 29 }; 30 } 31 }
由於資料是偽造的,所以就不考慮邏輯性,而是專注於linq語法層次,好了,上面這樣的linq,我們看看最後的結果會是怎麼樣的。
可以看到我們從資料庫中讀取到了三條資料,而且這時候我們equal中的條件是on p.ProductID equals o.ProductID,現在需求撲面而來了,如果我
不僅要判斷ProductID,還要判斷SupplierID也要相等,這樣的需求特麼的怎麼搞呢??? 那就看看我是怎麼搞的哈!!!
1 var query = from p in productList 2 join o in orderList 3 on new { ProductID = p.ProductID, SupplierID = p.SupplierID } equals new { ProductID = o.ProductID, SupplierID = o.SupplierID } 4 select new 5 { 6 ProductID = p.ProductID, 7 ProductName = p.ProductID, 8 OrderID = o.OrderID, 9 OrderName = o.OrderName, 10 SupplierID = p.SupplierID 11 };
看到沒有,標成紅色的就是程式碼的核心,正好我們利用到了匿名型別的equals重寫方法,就是因為這個重寫解決了多條件的問題,是不是很強大,下面
再簡單看看匿名型別的equals是怎麼被重寫的。
從圖中可以看到,匿名型別就是追個欄位的equals方法比較是否相等的,好了,到現在為止你應該明白了匿名型別對於linq來說是多麼的重要啦~~~