文章出處

  說起匿名類型,我們都知道這玩意都是為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來說是多么的重要啦~~~

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()