[C#] LINQ之Join與GroupJoin


聲明:本文為www.cnc6.cn原創,轉載時請注明出處,謝謝!

一、編寫Person與City類,如下:

 1     class Person
 2     {
 3         public int CityID { set; get; }
 4         public string Name { set; get; }
 5     }
 6     class City
 7     {
 8         public int ID { set; get; }
 9         public string Name { set; get; }
10     }

二、為以上兩個類建立一些數據,存儲於persons與cities中,如下:

 1     Person[] persons = new Person[]
 2     {
 3         new Person{ CityID = 1, Name = "ABC" },
 4         new Person{ CityID = 1, Name = "EFG" },
 5         new Person{ CityID = 2, Name = "HIJ" },
 6         new Person{ CityID = 3, Name = "KLM" },
 7         new Person{ CityID = 3, Name = "NOP" },
 8         new Person{ CityID = 4, Name = "QRS" },
 9         new Person{ CityID = 5, Name = "TUV" }
10     };
11     City[] cities = new City[]
12     {
13         new City{ ID = 1,Name = "Guangzhou" },
14         new City{ ID = 2,Name = "Shenzhen" },
15         new City{ ID = 3,Name = "Beijing" },
16         new City{ ID = 4,Name = "Shanghai" }
17     };

三、Join第一種用法:

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector);

官方釋義:基於匹配鍵對兩個序列的元素進行關聯。使用默認的相等比較器對鍵進行比較。

這個與數據庫中的INNER JOIN很類似,就是使用一個鍵(TKey)將兩個集合關聯起來,並對這兩個集合的元素進行選擇,作為結果輸出。

1、數據源本身為outer,需要作Join連接的集合為inner;

2、選擇一個outer內的一個元素,作為輸入參數,並輸出一個基於outer的鍵值;

3、選擇一個inner內的一個元素,作為輸入參數,並輸出一個基於inner的鍵值;

4、將基於outer的鍵值與inner的鍵值作為輸入參數,並輸出一個自己定義類型的結果選擇器;

5、返回的結果就是自己定義類型的集合。

編寫客戶端試驗代碼:

1     var result =  persons.Join(cities, p => p.CityID, c => c.ID, (p, c) => new { PersonName = p.Name, CityName = c.Name});
2     foreach(var item in result)
3     {
4         Console.WriteLine($"{item.PersonName},{item.CityName}");
5     }

從以上可以看出,persons為outer集合,cities為inner集合,p.CityID為outer的鍵值,c.ID為inner的鍵值,Join就是將persons內CityID與cities內ID相等性連接起來,並將persons內的每個元素及cities內的每個元素作為輸入參數,從從選擇自己想要的數據,如自己定義的匿名類型。

因為persons內CityID為5的城市編號不存在與cIties內,因此輸出結果不會含Name為“TUV”的信息。

輸出結果如下:

其等價的LINQ語句為:

1     var result = from p in persons
2                  join c in cities on p.CityID equals c.ID
3                  select new { PersonName = p.Name, CityName = c.Name };

四、Join第二種用法:

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer);

官方釋義:基於匹配鍵對兩個序列的元素進行關聯。使用指定的IEqualityComparer<TKey> 對鍵進行比較。

以上與Join第一種方法無非就是多一個IEqualityComparer<TKey>,如果使用一個繼承於IEqualityComparer<TKey>的類初始化comparer,它就會使用該類對對TOuter.TKey及TInner.TKey進行相等性比較,判斷是否進行連接,並輸出自己定義的類型集合。

五、GroupJoin第一種方法:

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector);

官方釋義: 基於鍵相等對兩個序列的元素進行關聯並對結果進行分組。使用默認的相等比較器對鍵進行比較。

這個與數據庫的LEFT OUTER JOIN很類似。與Join的區別就是:GroupJoin內resultSelector的輸入參數從TInner單個元素編程IEnumerable<TInner>元素集合,其他保持不變。用法與Join差不多,它也是基於TOuter.TKey及TInner.TKey的連接。

編寫客戶端試驗代碼:

 1     var result = persons.GroupJoin(cities, p => p.CityID, c => c.ID, (p, cs) => new { PersonName = p.Name, Citys = cs });
 2     foreach (var item in result)
 3     {
 4         Console.Write($"{item.PersonName}\t");
 5         foreach (var city in item.Citys)
 6         {
 7             Console.Write($"{city.Name}");
 8         }
 9         Console.WriteLine();
10     }

這個輸出會將Name為“TUV”的名字輸出,但其城市卻是空的,原因就是在cities找不到編號為5的City信息。

輸出結果如下:

其等價的LINQ語句為:

1     var result = from p in persons
2                  join c in cities on p.CityID equals c.ID into cs
3                  select new { PersonName = p.Name, Citys = cs };

六、GroupJoin第二種方法:

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer);

官方釋義:基於鍵相等對兩個序列的元素進行關聯並對結果進行分組。使用指定的IEqualityComparer<TKey>對鍵進行比較。

這個與Join第二種方法類似,這里不再進行講述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM