因为实在太懒了,很久没动笔,今天强迫自己写一个小短篇。

之前讨论过用SelectMany代替两重的foreach循环。今天我们看一下Join和foreach的关系。

首先是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
)

那么我们根据这个方法的定义的写具体的实现如下

        public static IEnumerable<TResult> MyJoin<TOuter, TInner, TKey, TResult>(
this IEnumerable<TOuter> outer,
IEnumerable<TInner> inner,
Func<TOuter, TKey> outerKeySelector,
Func<TInner, TKey> innerKeySelector,
Func<TOuter, TInner, TResult> resultSelector
)
{ List<TResult> result = new List<TResult>(); foreach (var o in outer)
{
var outerKey = outerKeySelector(o); foreach (var i in inner)
{
var innerKey = innerKeySelector(i); if (outerKey.Equals(innerKey))
{
result.Add(resultSelector(o, i));
}
}
} return result;
}

使用场景如下,存在两个有关联的表映射的集合对象。期望对两张表中数据做一个SQL中Join的级联效果

            List<Developer> developers = new List<Developer>
{
new Developer{ Name = "Leo1" , ProjectID = },
new Developer{ Name = "Leo2" , ProjectID = },
new Developer{ Name = "Leo3" , ProjectID = }
}; List<Tester> testers = new List<Tester>
{
new Tester{ Name = "Echo1" , ProjectID=},
new Tester{ Name = "Echo2" , ProjectID=},
new Tester{ Name = "Echo3" , ProjectID=},
new Tester{ Name = "Echo4" , ProjectID=},
new Tester{ Name = "Echo5" , ProjectID=},
new Tester{ Name = "Echo6" , ProjectID=}
}; var projects = developers.MyJoin(testers, d => d.ProjectID, t => t.ProjectID, (d, t) => new { d.ProjectID, Developer= d.Name, Tester = t.Name }); foreach (var p in projects)
{
Console.WriteLine(p.ProjectID);
Console.WriteLine(p.Developer);
Console.WriteLine(p.Tester);
}

一个开发配两个个测试,是不是很开心啊,不过这只是个Sample,你们就死心吧……结果如下

很简单的小例子,至少Linq to objects层面还是比较简单的。

同时祝愿各位.NET的工程师们能够越来越专业。面对快50岁的Boss说“代码不重要,业务最重要,代码就是10个if else和8个if else的区别”的时候能够不再迷茫,心中有数。不要把优美的C#写成了堆砌if else和switch case的意大利面条。

Linq的Join == 两个foreach的更多相关文章

  1. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...

  2. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...

  3. Linq常用List操作总结,ForEach、分页、交并集、去重、SelectMany等

    /* 以下围绕Person类实现,Person类只有Name和Age两个属性 一.List<T>排序 1.1 List<T>提供了很多排序方法,sort(),Orderby() ...

  4. linq 查询的两种方法 (在EF model中实现)

    众所周知:linq查询有两种方式 1.通过linq表达式查询 2.是通过linq方法查询 代码中 每一步都有注释

  5. C#中巧用妙法避免嵌套方式使用两个foreach循环

    问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...

  6. C# LINQ Join两个表连接,关联多个条件的写法

    1.sql语句: select * from Users u join Teachers t on u.UserID==t.TeacherID and u.Name=t.Name 2.linq写法: ...

  7. linq group join

    本篇介绍Linq的Group和Join操作,继续使用<Linq 学习(3) 语法结构>中介绍的数据源. GroupGroup是进行分组操作,同SQL中的Group By类似.原型如下: p ...

  8. linq之join子句

    前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句.join子句也是相对比较复杂的,所以最后来讲.join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联 ...

  9. [C#] LINQ之Join与GroupJoin

    声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.编写Person与City类,如下: class Person { public int CityID { set; get; } ...

随机推荐

  1. 转载 关于restTemplate 内部实现

    2016-12-28 by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/6228198.html  本篇概要 RestTemplate 类图 po ...

  2. windows 下 YII2 配置 memcache

    环境: 操作系统 :Windows 7; php: 5.6.8 apche:2.4.12 1.首先安装PHP  memcache 拓展,安装方法如下: 1.1下载 memcache 拓展DLL: ht ...

  3. struts2配置默认首页

    配置struts2 默认欢迎页的几种办法: 1.首先需要明确的是struts过滤器配置映射的模式是路径匹配还是扩展匹配,如果url-pattern配置为/*,如果不做特殊处理,是不会转到welcome ...

  4. JSTL的基本使用

    <body> <% request.setAttribute("name", "lisi123"); request.setAttribute ...

  5. PLSQL Developer工具的使用

    1.运行 2.字体大小 导入csv文件. 任何工具都有失败的可能, 这个时候,也失败了. 当然还有另一种可能,文件被人为改过了,括号改过了,就即使使用下面的kettle工具也没用了.这时可以导出文件对 ...

  6. 自己动手搭建Git服务器-Gitblit

      首先到官网http://gitblit.com/下载最新版本的Gitblit GO 解压缩到本地目录中 E:\git\gitblit132 官方文档:http://gitblit.com/setu ...

  7. VMTurbo:应对散乱虚拟机的强劲工具

    随着服务器虚拟化技术越来越成熟,虚拟机散乱(VM sprawl)和主机资源管理成为了虚拟化数据中心的管理员眼里的两大问题.面对这种情形,一种可行的解决办法就是使用一款名为VMTurbo(vmturbo ...

  8. ubuntu 12.04安装jdk 8

    转载:http://www.itnose.net/detail/6196130.html Ubuntu12.4安装jdk1.8 1.要安装的jdk,我把它拷在了共享文件夹里面.    (用优盘拷也可以 ...

  9. PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类

    摘要 分型是计算生物学的一个新兴领域,在临床决策和生物医学科学中有着重要的应用. 虽然机器学习技术在许多生物医学应用中显示出巨大的潜力,但它们在分型中的用途尚未完全理解. 在本文中,我们研究了基于聚类 ...

  10. [Selenium]Click element under a hidden element

    Description: Find out the DDL in Treegrid, but cannot click on it.Because the element is under a hid ...