扩展方法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 2009-10-07 14:29  冯瑞涛  阅读(1099)  评论(0编辑  收藏  举报