1.LINQ的数据源
必须可枚举的,即必须是数组或者集合
(继承了IEnumerable<T>接口就可以,注意是IEnumerable<T>,不是IEnumerable接口,不一样,继承后者只能使用foreach,不能使用linq)
定义:Linq 是一跨各种数据源和数据格式的数据模型;它在查询是,始终是把它作为一种对象来操作,可以使用基本相同的编码模型查询和数据的转换XML,SQL,ADO数据等;
对于自定义属性类,继承CollectionBase类,实现了索引器,但是没有实现集合的函数,所以这种类是无法实现LINQ语句的,但是可以使用foreach来访问,书中讲foreach遍历的是实现了IEnumerale接口的集合,可见并不是这样的,foreach只是遍历有索引器的集合,而LINQ才真正遍历实现了IEnumerable接口的集合
复习一下集合的要求:
1.要迭代一个类,需要实现GetEnumerator()方法,返回类型是IEnumerator
2.要迭代类的成员,使用IEnumerable返回类型
class farmer : CollectionBase
{
public string _name;
public int _age;
public farmer(string s, int i )
{
_name = s;
_age = i;
}
public void add(farmer s)
{
List.Add(s);
}
public farmer this[int index]
{
set { List[index] = value; }
get { return (farmer)List[index]; }
}
}
2.LINQ的两种写法
var query = from customer in this._customerList
where customer.City == "台北"
let Index = this._customerList.IndexOf(customer)
- select new { customer, Index };
这种写法的select可以返回对象,字段,匿名类型返回的是一个新的对象(这样理解var query = new {customer,index})
------------------------------------------------------------------------------------------
var query = this._customerList
.Where(c => c.City == "台北") //这里面的C就是对象
.Select(c => new { custom = c, Index = this._customerList.IndexOf(c) }); //返回的是新的query对象集合,这个集合里面装的是匿名对象‘a的集合
这种写法中Select叫做投影运算符,是在Linq查询中从其他数据类型中创建新数据类型的技术(它可以改变结果的原始类型)
其中Select和Where的顺序可以调换
重点:只有在这种写法中才能用lambda表达式
Foreach 迭代时访问的其实是IEnumerator迭代器这个东西,任何实现了IEnumerator GetNumerator方法的接口,都能实现foreach的遍历
LINQ的数据源必须是继承了IEnumerable<T>接口的类,LINQ迭代的不仅仅是IEnuamertor迭代器,还有其他东西
from 指定数据源和范围变量
where 根据布尔表达式(由逻辑与 或 等组成)从数据源中筛选元素
select 指定查询结果中的元素所具有的类型或表现形式
group 对对查询结果按照键值进行分组
into 提供一个标示符,它可以充当对 join group 或 select 子句结果的引用
orderby 对查询出的元素进行排序
join 按照两个指定匹配条件来联接俩个数据源
let 产生一个用于查询表达式中子表达式查询结果的范围变量
在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。
yield return <expression>;
yield break;
计算表达式并以枚举数对象值的形式返回;expression 必须可以隐式转换为迭代器的 yield 类型。
yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。