日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
LINQ聯(lián)接序列的五種簡單方法

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

同類的聯(lián)接

Concat()

Union()

不同類的聯(lián)接

Zip()

Join()

GroupJoin()

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

最簡單的序列合并,concat僅僅是將第二個(gè)序列接在***個(gè)序列后面, 注意:返回的序列并沒有改變?cè)瓉碓氐捻樞颍?/p>

 
 
 
  1.  var healthFoods = new List { "fruits", "vegetables", "grains", "proteins" };
  2. var myFoods = new List { "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ù)項(xiàng)的串聯(lián)序列

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

是否是重復(fù)的項(xiàng)目取決于IEqualityComparer ,如果你沒有提供個(gè)性化的定義,則使用該類型的默認(rèn)函數(shù)。 請(qǐng)注意,如果 T 是一個(gè)自定義的類型,這意味著你同時(shí)需要一個(gè)有效的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() – 簡單一對(duì)一的聯(lián)接

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

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

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

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

 
 
 
  1.  var employees = new List
  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
  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)接它們,給每個(gè)雇員提供一個(gè)座位:

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

我們可以得到:

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

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

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

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

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

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

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

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

 
 
 
  1.  public class Badge
  2. {
  3.     public int EmployeeId { get; set; }
  4.     public int BadgeNumber { get; set; }
  5. }
  6. var employees = new List
  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
  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 來對(duì)它們進(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 對(duì)于1:1的關(guān)系是非常實(shí)用的,或者如果你不在乎返回一些重復(fù)的1:N的關(guān)系,你也可以是用Join.

GroupJoin() – 適用于一對(duì)多的條件聯(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)步一強(qiáng)化對(duì)Join 和 GroupJoin 區(qū)別的了解,可以再一次看看上面兩個(gè)例子輸入的結(jié)果。


網(wǎng)頁題目:LINQ聯(lián)接序列的五種簡單方法
鏈接URL:http://www.dlmjj.cn/article/dhcdsdg.html