成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ聯(lián)接序列的五種簡單方法

開發(fā) 后端
這五種LINQ函數(shù)聯(lián)接序列的方法非常奇妙,希望各位.NET程序員能掌握,并在實際開發(fā)中運用上。

今天我們來看看5種使用Linq函數(shù)聯(lián)接序列的方法,這5種方法可以歸入下列兩類:

同類的聯(lián)接

Concat()

Union()

不同類的聯(lián)接

Zip()

Join()

GroupJoin()

Concat() – 串聯(lián)序列

最簡單的序列合并,concat僅僅是將第二個序列接在***個序列后面, 注意:返回的序列并沒有改變原來元素的順序:

  1.  var healthFoods = new List<string> { "fruits""vegetables""grains""proteins" };  
  2. var myFoods = new List<string> { "grains""proteins""M&Ms""soda" };  
  3. // 返回序列: fruits, vegetables, grains, proteins, grains, proteins, M&Ms, soda  
  4. var healthyFirst = healthFoods.Concat(myFoods);  
  5. // 返回序列: grains, proteins, M&Ms, soda, fruits, vegetables, grains, proteins  
  6. var mineFirst = myFoods.Concat(healthFoods); 

Union() – 無重復(fù)項的串聯(lián)序列

該方法用于結(jié)合兩個沒有重復(fù)項的集合,也非常適用于任何兩個序列。 它將第二個序列結(jié)合到***個序列里,當(dāng)?shù)诙€序列中出現(xiàn)與***個序列重復(fù)的項時,它只保留***序列的項目。

是否是重復(fù)的項目取決于IEqualityComparer <T> ,如果你沒有提供個性化的定義,則使用該類型的默認(rèn)函數(shù)。 請注意,如果 T 是一個自定義的類型,這意味著你同時需要一個有效的Equals() 和 GetHashCode()的定義。

  1. // 返回序列: fruits, vegetables, grains, proteins, M&Ms, soda  
  2. var healthyFirst = healthFoods.Union(myFoods);  
  3. // 返回序列: grains, proteins, M&Ms, soda, fruits, vegetables  
  4. var mineFirst = myFoods.Union(healthFoods); 

Zip() – 簡單一對一的聯(lián)接

該方法針對兩個不同類執(zhí)行一個最簡單的聯(lián)接。 比如給定兩個序列,它僅僅將他們的***個項合并,而后將他們第二個項合并,…,一旦到達(dá)較短序列的***一項,它就會立即停止。

比方說,比如,我們有下面的類定義:

  1.  public class Employee  
  2. {  
  3.     public int Id { getset; }  
  4.     public string Name { getset; }  
  5.     public double Salary { getset; }  
  6. }  
  7. public class Seat  
  8. {  
  9.     public int Id { getset; }  
  10.     public double Cost { getset; }  

然后,我們確定了以下順序:

  1.  var employees = new List<Employee>  
  2.     {  
  3.         new Employee { Id = 13, Name = "John Doe", Salary = 13482.50 },  
  4.         new Employee { Id = 42, Name = "Sue Smith", Salary = 98234.13 },  
  5.         new Employee { Id = 99, Name = "Jane Doe", Salary = 32421.12 }  
  6.     };  
  7. var seats = new List<Seat>  
  8.     {  
  9.         new Seat { Id = 1, Cost = 42 },  
  10.         new Seat { Id = 2, Cost = 42 },  
  11.         new Seat { Id = 3, Cost = 100 },  
  12.         new Seat { Id = 4, Cost = 100 },  
  13.         new Seat { Id = 5, Cost = 125 },  
  14.         new Seat { Id = 6, Cost = 125 },  
  15.     }; 

我們可以聯(lián)接它們,給每個雇員提供一個座位: 

  1. var seatingAssignments = employees.Zip(seats, (e, s) => new 
  2.     { EmployeeId = e.Id, SeatId = s.Id });  
  3. foreach (var seat in seatingAssignments)  
  4. {  
  5.     Console.WriteLine("雇員: " + seat.EmployeeId + " 預(yù)約了座位 " + seat.SeatId);  
  6.  
  7. }      

我們可以得到:

雇員: 13 預(yù)約了座位1

雇員: 42 預(yù)約了座位2

雇員: 99 預(yù)約了座位3

Join() – 滿足條件的聯(lián)接

“使用 join 子句可以將來自不同源序列并且在對象模型中沒有直接關(guān)系的元素相關(guān)聯(lián)。 唯一的要求是每個源中的元素需要共享某個可以進(jìn)行比較以判斷是否相等的值。 例如,食品經(jīng)銷商可能具有某種產(chǎn)品的供應(yīng)商列表以及買主列表。 例如,可以使用 join 子句創(chuàng)建該產(chǎn)品同一指定地區(qū)供應(yīng)商和買主的列表。

join 子句接受兩個源序列作為輸入。 每個序列中的元素都必須是可以與另一個序列中的相應(yīng)屬性進(jìn)行比較的屬性,或者包含一個這樣的屬性。 join 子句使用特殊的 equals 關(guān)鍵字比較指定的鍵是否相等。 join 子句執(zhí)行的所有聯(lián)接都是同等聯(lián)接。 join 子句的輸出形式取決于所執(zhí)行的聯(lián)接的具體類型。 ”

是否相等取決于IEqualityComparer<T>,如果你使用自定義的類型,你需要提供 Equals() 和 GetHashCode() 或者提供一個自定義的 IEqualityComparer<T>. 但是你使用的.NET 中的類型,則一般不需要再另外實現(xiàn)這些函數(shù)。

上例子,使用之前的Employee類,再加一個Badge類,然后我們再創(chuàng)建這一組序列:

  1.  public class Badge  
  2. {  
  3.     public int EmployeeId { getset; }  
  4.     public int BadgeNumber { getset; }  
  5. }  
  6. var employees = new List<Employee>  
  7.     {  
  8.         new Employee { Id = 13, Name = "John Doe", Salary = 13482.50 },  
  9.         new Employee { Id = 42, Name = "Sue Smith", Salary = 98234.13 },  
  10.         new Employee { Id = 99, Name = "Jane Doe", Salary = 32421.12 }  
  11.     };  
  12. var badges = new List<Badge>  
  13.     {  
  14.         new Badge { EmployeeId = 10, BadgeNumber = 1 },  
  15.         new Badge { EmployeeId = 13, BadgeNumber = 2 },  
  16.         new Badge { EmployeeId = 20, BadgeNumber = 3 },  
  17.         new Badge { EmployeeId = 25, BadgeNumber = 4 },  
  18.         new Badge { EmployeeId = 42, BadgeNumber = 5 },  
  19.         new Badge { EmployeeId = 10, BadgeNumber = 6 },  
  20.         new Badge { EmployeeId = 13, BadgeNumber = 7 },  
  21.     }; 

這樣我們就可以使用Join 來對它們進(jìn)行操作了:

  1.  var badgeAssignments = employees.Join(badges, e => e.Id, b => b.EmployeeId,  
  2.     (e, b) => new { e.Name, b.BadgeNumber });  
  3. foreach (var badge in badgeAssignments)  
  4. {  
  5.     Console.WriteLine("Name: " + badge.Name + " has badge " + badge.BadgeNumber);  
  6. }    

返回的結(jié)果是:

  Name: John Doe has badge 2

 Name: John Doe has badge 7

 Name: Sue Smith has badge 5

Join 對于1:1的關(guān)系是非常實用的,或者如果你不在乎返回一些重復(fù)的1:N的關(guān)系,你也可以是用Join.

GroupJoin() – 適用于一對多的條件聯(lián)接

那么,如果你有1:N的關(guān)系,你希望這些結(jié)果分類組合在一起就可以用到 GroupJoin(),仍舊用上面的例子:

  1.  var badgeAssignments = employees.GroupJoin(badges, e => e.Id, b => b.EmployeeId,  
  2.     (e, bList) => new { Name = e.Name, Badges = bList.ToList() });  
  3. foreach (var assignment in badgeAssignments)  
  4. {  
  5.     Console.WriteLine(assignment.Name + " has badges:");  
  6.     if (assignment.Badges.Count > 0)  
  7.     {  
  8.         foreach (var badge in assignment.Badges)  
  9.         {  
  10.             Console.WriteLine("\tBadge: " + badge.BadgeNumber);  
  11.         }  
  12.     }  
  13.     else 
  14.     {  
  15.         Console.WriteLine("\tNo badges.");  
  16.     }  
  17. }    

結(jié)果如下:

  1. John Doe has badges:  
  2.         Badge: 2  
  3.         Badge: 7  
  4. Sue Smith has badges:  
  5.         Badge: 5  
  6. Jane Doe has badges:  
  7.         No badges. 

如果你想進(jìn)步一強化對Join 和 GroupJoin 區(qū)別的了解,可以再一次看看上面兩個例子輸入的結(jié)果。

原文鏈接:http://www.cnblogs.com/multiplesoftware/archive/2011/05/17/2048319.html

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機讀取數(shù)據(jù)淺析
  3. Linq Lambda表達(dá)式全面分析
  4. Linq擴展方法簡單分析
  5. 初探Linq局部變量類型

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2022-12-29 07:33:44

Strace故障排除

2020-10-20 08:26:03

軟件編碼程序員

2011-03-02 10:01:15

2020-06-03 11:26:05

算法移動設(shè)技術(shù)

2009-09-16 11:15:52

Linq聯(lián)接數(shù)據(jù)

2023-07-11 09:24:11

2009-09-08 10:37:57

C#遍歷CheckBo

2021-06-02 09:24:48

Apple ID密碼iCloud

2019-07-05 09:45:19

UbuntuLinux釋放空間

2009-09-17 11:29:50

Linq擴展方法

2009-09-11 10:20:36

Linq擴展方法

2010-07-20 14:07:31

更改TELNET端口

2010-06-08 17:46:31

OpenSUSE安裝

2010-08-06 13:23:58

NFS配置

2010-03-15 14:10:34

ubuntu系統(tǒng)

2010-09-30 14:01:38

2009-08-12 16:47:36

C#轉(zhuǎn)換農(nóng)歷

2010-11-23 16:21:07

MySQL大表備份

2011-04-06 09:09:17

MySQL數(shù)據(jù)庫備份

2010-03-03 13:56:43

Linux ubant
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区视频 | 国产在线视频三区 | 国产精品一区二区在线 | 日韩久久精品视频 | 毛片在线免费 | 国产99久久 | 国内精品久久精品 | 欧美成人免费在线视频 | 成人免费看黄 | a在线观看| 午夜天堂精品久久久久 | 一本大道久久a久久精二百 国产成人免费在线 | 在线欧美一区 | 中文字幕精品一区二区三区在线 | 久久久123 | 黄片毛片| 亚洲人成人一区二区在线观看 | 久久精品男人的天堂 | 国产一区亚洲二区三区 | 超碰97人人人人人蜜桃 | 91精品国产一区二区三区 | 四虎影院在线观看免费视频 | 欧美激情精品久久久久久免费 | 久艹av | 91久久国产综合久久 | 天天拍天天操 | 亚洲国内精品 | 日韩欧美精品 | 日本在线中文 | 久久久久精 | 91免费视频 | 国产h视频 | 国产三级日本三级 | 亚洲精品一区中文字幕 | 国产激情91久久精品导航 | 一区二区在线 | 99精品在线观看 | 亚洲欧美日韩一区二区 | 最新国产视频 | 中文字幕视频在线观看 | 91在线精品视频 |