LINQ入门笔记----LINQ To Object<SelectMany()>
LINQ To Object
概述
LINQ To Object是用于操作内存对象的LINQ编程接口,包含了大量的查询操作符,针对内存中的集合对象进行操作.
LINQ To Object的实现基于IEnumerable泛型接口、序列(sequences)以及标准查询操作符(Standard Query Operators)等基本概念.其中,IEnumerable泛型接口是使用C#2.0泛型技术实现的一个接口,该接口与IEnumerable类似,允许对接口内部的元素进行列举操作;序列是一个专门术语,表示一个实现了IEnumerable接口的集合对象.
LINQ To Object的大部分操作是针对序列的.标准查询操作符本质上是一些拓展方法,这些拓展方法定义在静态类System.Linq.Enumerable 中,其原型的第一个参数(带this修饰符的参数)是IEnumerable类型.由于这些方法都是扩展方法,它们可以在IEnumerable实例对象上直接调用,无需为调用传递一个类型为IEnumerable的对象作为第一个参数.
要在代码中使用LINQ To Object标准查询操作符,需要在代码中添加using System.Linq 指令,以引入必要的命名空间.
SelectMany()
<SelectMany的参数信息>
SelectMany 将序列的每个元素投影到IEnumerable 并将结果序列合并为一个序列.关于这里我依然存在很多的疑问,比如关系运算中的投影运算,Select和SelectMany的差别,他们的用法,由于是自学的,所以基础真的很欠缺,而且断层较多,尽管我断点观察了它们的值,也发现了一些区别,虽然无法总结无法解释,但是依然选择将它们贴出来,一来是想要寻求帮助的;二来是想之后有能力回过头再看,所以具体区别如下所示:
首先是定义的数据:
items是SelectMany()方法得到的结果:
items2是Select()方法得到的结果:
小结:
首先说明一下过程,我定义了一个字符串数组,其中元素分别如图所示,而之后使用split方法以','分隔数组,然后将值与索引值分别给了word和Index,SelectMany() 方法在输出时可以访问word属性和Index属性,而且从图中可以看出他们似乎存在于一个很大的集合中,也就是说他们属于同一级别下.反观Select() 方法,以同样的写法获取返回值,但是在访问输出的时候并不可以通过自定义的word和Index访问值和索引,而且从图中看到的是返回的集合有5个元素,这五个元素中包含存在子集,而子集中拥有定义过的word和Index.这是肉眼可见的区别.
另外,关于逻辑运算中的投影与选择的关系,我查阅了一部分资料,结果是这样的:
选择:通过选择获取行结果;
投影:通过投影获取列
集合R |
||
A |
B |
C |
5 |
6 |
2 |
7 |
3 |
1 |
9 |
8 |
6 |
投影A,B |
|
A |
C |
5 |
2 |
7 |
1 |
9 |
6 |
选择A>6 |
||
A |
B |
C |
7 |
3 |
1 |
9 |
8 |
6 |