扩展方法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:
分享到:
相关推荐
- 布尔类型bool只有两个值:true和false。 - 字符类型char存储Unicode字符,可以使用转义序列如'\n'(换行)和'\t'(制表符)。 - 特殊类型如object是所有类型的基类,string是不可变的Unicode字符串。 变量和常量...
C#中的LINQ操作符,如`Where()`、`Select()`、`Join()`和`GroupBy()`,在处理文本数据时特别有用。例如,`Where()`可以用来过滤出满足特定条件的字符或单词,`Select()`则可以用来转换或投影数据,`Join()`用于合并...
根据文档内容推测,它可能是指某种命令或者操作符,在后续章节中有具体解释。 - **tT. P5.**:这些可能是章节标题,分别对应不同的主题或步骤。例如,“tT.”可能指代某种技术或过程,“P5.”可能是某个具体的步骤...
- 在C#中创建一个公共类AddDll,并定义一个公共方法iadd,该方法接受两个整数参数a和b,返回它们的和。这是将要在C++中被调用的函数。 - 在C#中编写DLL时,需要使用`using`关键字引入必要的命名空间,并且类和方法...
随着版本的不断更新,C#语言不断引入新的特性,如异步编程模型(async和await关键字)、C#的版本迭代引入了对模式匹配的支持(如switch表达式和is操作符),以及引入了C# 8中的可为空引用类型(Nullable Reference ...
- **operator**:用于声明操作符重载。 - **throw**:用于抛出异常。 - **break**:用于跳出循环或 switch 语句。 - **finally**:在 try...catch...finally 语句块中执行清理工作。 - **out**:用于指定方法参数按...
LINQ支持对数据进行查询、插入、更新等操作,但不支持直接导入数据。 - **查询**:LINQ最核心的功能之一就是能够以类似SQL的方式进行数据查询。 - **插入**:可以通过LINQ提供的扩展方法来实现数据的插入。 - **...
- `is`:类型测试操作符。 - `sizeof`:获取类型大小。 - `while`:循环语句。 - `double`:双精度浮点数。 - `lock`:锁定对象以防止多线程冲突。 - `stackalloc`:分配栈内存。 ##### 上下文关键字 上下文关键字...
1.1.2 as操作符——引用类型转换 3 1.1.3 base关键字——从派生类中访问基类的成员 3 1.1.4 变量——存储特定类型的数据 4 1.1.5 Console类——控制台中的输入流、输出流和错误流 6 1.1.6 Convert类——类型转换 8 ...
- **关系操作符**:用于比较两个值。 - **关系表达式**:返回布尔值true或false。 - **7.5 逻辑操作符和逻辑表达式** - **逻辑操作符**:用于连接多个布尔表达式。 - **逻辑表达式**:返回布尔值true或false。 ...
- **解析**: Java中使用Unicode编码来表示字符,每个字符占用两个字节。 #### 19. 数据表的数据类型 - **知识点**: 数据表中字段的数据类型。 - **解析**: 在设计数据表时,逻辑型数据类型通常不会被作为一个选项...
实例047 计算两个矩形矩阵的乘积 75 实例048 获取多维数组的行数与列数 78 实例049 使用快速排序法对一维数组进行排序 79 实例050 使用sort方法对数组进行快速排序 81 实例051 按指定条件在数组中检索元素 82 实例...
在C#编程中,基类和工具类是两个重要的概念,它们在软件开发过程中起着不可或缺的作用。基类,也称为父类或超类,是用来创建其他类的基础,它定义了共享属性和行为,子类可以继承这些特性,从而实现代码的重用和扩展...
5. **表达式** - 表达式是由操作符连接的值和变量,它们计算出一个值。C#支持算术、比较、逻辑等多种类型的表达式。 6. **声明** - 在C#中,声明用来指定变量、常量、函数等的类型和名称。例如,`int age = 30;`...
实例047 计算两个矩形矩阵的乘积 实例048 获取多维数组的行数与列数 实例049 使用快速排序法对一维数组进行排序 实例050 使用sort方法对数组进行快速排序 实例051 按指定条件在数组中检索元素 实例052 反转数组中...