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

LINQ聯接序列的五種簡單方法

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

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

同類的聯接

Concat()

Union()

不同類的聯接

Zip()

Join()

GroupJoin()

Concat() – 串聯序列

最簡單的序列合并,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() – 無重復項的串聯序列

該方法用于結合兩個沒有重復項的集合,也非常適用于任何兩個序列。 它將第二個序列結合到***個序列里,當第二個序列中出現與***個序列重復的項時,它只保留***序列的項目。

是否是重復的項目取決于IEqualityComparer <T> ,如果你沒有提供個性化的定義,則使用該類型的默認函數。 請注意,如果 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() – 簡單一對一的聯接

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

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

  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.     }; 

我們可以聯接它們,給每個雇員提供一個座位: 

  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 + " 預約了座位 " + seat.SeatId);  
  6.  
  7. }      

我們可以得到:

雇員: 13 預約了座位1

雇員: 42 預約了座位2

雇員: 99 預約了座位3

Join() – 滿足條件的聯接

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

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

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

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

  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 來對它們進行操作了:

  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. }    

返回的結果是:

  Name: John Doe has badge 2

 Name: John Doe has badge 7

 Name: Sue Smith has badge 5

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

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

那么,如果你有1:N的關系,你希望這些結果分類組合在一起就可以用到 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. }    

結果如下:

  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. 

如果你想進步一強化對Join 和 GroupJoin 區別的了解,可以再一次看看上面兩個例子輸入的結果。

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

【編輯推薦】

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

 

責任編輯:彭凡 來源: 博客園
相關推薦

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

算法移動設技術

2009-09-16 11:15:52

Linq聯接數據

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-11 10:20:36

Linq擴展方法

2009-09-17 11:29:50

Linq擴展方法

2010-08-06 13:23:58

NFS配置

2010-07-20 14:07:31

更改TELNET端口

2010-06-08 17:46:31

OpenSUSE安裝

2010-03-15 14:10:34

ubuntu系統

2010-09-30 14:01:38

2010-11-23 16:21:07

MySQL大表備份

2009-08-12 16:47:36

C#轉換農歷

2011-04-06 09:09:17

MySQL數據庫備份

2010-03-03 13:56:43

Linux ubant
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av电影一区| 精品真实国产乱文在线 | 中文字幕一区二区三区乱码在线 | 国产一区三区在线 | 四虎在线观看 | 亚洲欧美在线一区 | 婷婷福利视频导航 | 日韩毛片免费看 | 久久欧美精品 | 久久久久一区二区三区 | 国产欧美在线一区二区 | 久久久久久久久国产成人免费 | 在线观看黄免费 | 麻豆a级片 | 日韩欧美在线观看 | 欧美日本亚洲 | 亚洲国产精品一区二区第一页 | 北条麻妃av一区二区三区 | 久久国产区 | 成人av免费在线观看 | 黄色网络在线观看 | 国产中文字幕网 | 国产视频福利一区 | 中文字幕成人av | 中文字幕第7页 | 一区二区三区国产 | 欧洲精品在线观看 | 久久久综合精品 | 亚洲精品乱码久久久久久9色 | 一级看片免费视频囗交动图 | 国产伦精品一区二区三毛 | 国精日本亚洲欧州国产中文久久 | 中文字幕人成人 | 精品国产免费一区二区三区演员表 | 亚洲第一在线视频 | 日韩高清黄色 | 成人在线免费视频观看 | 2019天天干天天操 | 中文字幕精品一区二区三区在线 | 超碰在线播 | 亚洲精品一区二区冲田杏梨 |