22.C#分組和查詢延續及選擇綜合症(十一章11.6-11.7)

來源:互聯網
上載者:User

標籤:

  對於昨天的串連還有一個知識點沒有說,那就是分組串連。是11.5中的內容,補上。

  分組串連的格式:join 元素 in 序列

          on 條件運算式

          into 新的序列

  內串連和分組串連之間的一個重要差異(即分組串連和普通分組之間的差異)是,對於分組串連來說,在左邊序列和結果序列之間是一對一的對應關係,即使左邊序列中的某些元素在右邊序列沒有任何匹配的元素,也無所謂。這是非常重要的,有時會用於類比SQL的左外串連。在左邊元素不匹配任何右邊元素的時候,嵌入序列就是空的。與內串連一樣,分組串連要對右邊序列進行緩衝,而對左邊序列進行流處理。看代碼吧。

 1 //使用分組串連 2 var result7 = from box in boxList 3               join item in list on box.jewelleryType equals item.Type into items 4               select new { box, items }; 5 //使用分組串連給我的感覺就好像將一系列的珠寶(具有相同屬性值),進行打包,當然產生的也是一個序列,而上 6 //述中的box則作為存放這些一些相同屬性珠寶的標識 7 Console.WriteLine(result7.Count()); 8  9 foreach (var re in result7)10 {11     Console.WriteLine(re.box.BoxName);12     foreach (var item in re.items)13     {14         Console.WriteLine(item.Price);15     }16 }

  這裡的代碼是接著昨天的代碼的,哈哈,可能要看看上一篇文章。

  • 使用多個from子句進行交叉串連和定序序列

  到目前為止,我們學到的串連都是相等串連--左邊序列中的元素和右邊序列要進行匹配。交叉串連不在序列之間執行任何匹配操作,它只儘可能列出所有的可能。我們建立一個類,叫Customer

1 class Customer2 {3     public string Name { get; set; }4 }
 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 List<Customer> ctrList = new List<Customer>()12 {13     new Customer() {Name="111" },14     new Customer() {Name="222" },15     new Customer() {Name="333" },16     new Customer() {Name="444" },17     new Customer() {Name="555" }18 };19 20 var result9 = from ctr in ctrList21               from jly in list22               select new { ctr, jly };23 Console.WriteLine(result9.Count());

  結果為30,因為珠寶有6件,顧客有5人,5*6=30。可見,使用兩個from子句可能交叉串連返回所有組合的序列。

  •  使用group...by子句進行分組

  格式:group 元素 by 關鍵字

  grouping運算式通過其鍵來決定序列如何分組。整個結果是一個序列,序列中的每個元素本身就是投影后元素的序列,還具有一個Key屬性,即用於分組的鍵。下面來做一個操作,用珠寶的類型進行分組。

 1 var result10 = from jly in list 2                group jly by jly.Type; 3  4 Console.WriteLine(result10.Count()); 5  6 foreach (var jlys in result10) 7 { 8     Console.WriteLine(jlys.Key); 9     foreach(var jly in jlys)10     {11         Console.WriteLine(jly.Price);12     }13 }

感覺和使用join...into子句出來的效果是一樣的,但是使用group...by更能讓人理解。

  • 查詢延續

  查詢延續提供了一種方式,把一個查詢運算式的結果用作另一個查詢運算式的初始序列。它可以應用於group..by和select子句上,文法對於兩者是一樣的,只需要使用內容關鍵字into,如要查詢每種類型珠寶的數量,可以這樣表示。

1 var result11 = from jly in list2                group jly by jly.Type into jlys3                select new { Type = jlys.Key, Count = jlys.Count() };4 5 foreach(var item in result11)6 {7     Console.WriteLine(item.Type);8     Console.WriteLine(item.Count);9 }

結果為:

表明每一種類型都有兩件珠寶。

  • 使用LINQ運算式還是使用擴充方法

  對於如何選擇,每個心中都有數,這裡只說下兩者的關係。

  每個查詢運算式都可能使用擴充方法來表示,但很多LING操作在C#中不存在等價的查詢運算式。

  請斧正,抱一個學習的心態認真地做一件事情。

22.C#分組和查詢延續及選擇綜合症(十一章11.6-11.7)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.