随笔 - 705  文章 - 0  评论 - 1103  阅读 - 138万 

扩展方法Distinct()两个集合中的每一个列出了一次(唯一)、Union()并、Intersect()交和Except()差都是设置操作。下面创建一个驾驶Ferrari 的一级方程
式冠军序列和驾驶McLaren 的一级方程式冠军序列,然后确定是否有驾驶Ferrari 和McLaren 的冠军(交集)。当然,
这里可以使用Intersect()扩展方法。
首先获得所有驾驶Ferrari 的冠军。这只是一个简单的LINQ 查询,其中使用复合的from 子句访问属性
Cars,返回一个字符串对象序列。

var ferrariDrivers = from r in
Formula1.GetChampions()
from c in r.Cars
where c == "Ferrari"
orderby r.LastName
select r;
现在建立另一个相同的查询,但where 子句的参数不同,以获得所有驾驶McLaren 的冠军。最好不要再
次编写相同的查询。而可以创建一个方法,给它传送参数car:
private static IEnumerable <Racer>
GetRacersByCar(string car)
{
return from r in Formula1.GetChampions()
from c in r.Cars
where c == car
orderby r.LastName
select r;
}
但是,因为该方法不需要在其他地方使用,所以应定义一个委托类型的变量来保存LINQ 查询。

变量racerByCar 必须是一个委托类型,

它需要一个字符串参数(传值的参数),返回IEnumerable <Racer>,类似于前面实现的方法。

为此,定义了带有两个泛型的委托Func<string, IEnumerable<Racer>> ,把一个λ表达式赋予变量racerByCar。

λ表达式的

左边定义了一个car 变量,其类型是Func 委托的第一个泛型参数(字符串)。

右边定义了LINQ 查询,where 子句中会用到car,也就是Lambda的左值

现在可以使用Intersect()扩展方法,获得既驾驶Ferrari 获得冠军,又驾驶McLaren获得冠军的车手,他们的交集

 

private static void Intersect()
       {
           Func<string, IEnumerable<Racer>> racersByCar =
              car => from r in Formula1.GetChampions()//对应,racersByCar("Ferrari"),car 是string 右式是根据car执行的匿名委托,调用的时候,根据Car获得Racer结果的方法
                     from c in r.Cars
                     where c == car
                     orderby r.LastName
                     select r;

           Console.WriteLine("champion with Ferrari and McLaren");

           foreach (var racer in racersByCar("Ferrari").Intersect(racersByCar("McLaren")))//返回结果是自身与参数集相交的部分
           {
               Console.WriteLine(racer);
           }
       }

结果只有一个赛手Niki Lauda:

image

posted on   冯瑞涛  阅读(1100)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示