经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
[C#] LINQ之Join与GroupJoin
来源:cnblogs  作者:cnc  时间:2018/10/30 9:04:36  对本文有异议

声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢!

一、编写Person与City类,如下:

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

二、为以上两个类建立一些数据,存储于persons与cities中,如下:

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

三、Join第一种用法:

  1. 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. 1 var result = persons.Join(cities, p => p.CityID, c => c.ID, (p, c) => new { PersonName = p.Name, CityName = c.Name});
  2. 2 foreach(var item in result)
  3. 3 {
  4. 4 Console.WriteLine($"{item.PersonName},{item.CityName}");
  5. 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. 1 var result = from p in persons
  2. 2 join c in cities on p.CityID equals c.ID
  3. 3 select new { PersonName = p.Name, CityName = c.Name };

四、Join第二种用法:

  1. 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第一种方法:

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

这个输出会将Name为“TUV”的名字输出,但其城市却是空的,原因就是在cities找不到编号为5的City信息。

输出结果如下:

其等价的LINQ语句为:

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

六、GroupJoin第二种方法:

  1. 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第二种方法类似,这里不再进行讲述。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号