(1)使用
针对集合类型编写foreach代码块,都是在使用迭代器
集合类型实现了IEnumerable接口
都有一个GetEnumerator方法
(2)迭代器优点
假如要遍历一个庞大的集合,只要其中一个元素满足条件,据完成了任务。
(3)yield关键字
MSDN中:
在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。
(4)注意事项:
1.在foreach循环式多考虑线程安全性,在foreach时不要试图对便利的集合进行remove和add操作,任何集合,即使被标记为线程安全,在foreach时,增加项和移除项都会导致异常。
2.IEnumerable接口是LINQ特性的核心接口
只有实现了IEnumerable接口的集合,才能执行相关的LINQ操作,比如select,where等
LINQ
1.查询操作符
(1)源起
.net的设计者在类库中定义了一系列拓展的方法,方便用户操作集合对象。
(2)使用
一些系列拓展方法,eg:Where,Max,Select,Sum,Any,Average,All,Concat等都是针对IEnumerable的对象进行拓展,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1.LINQLearn
{
class Program
{
static void Main(string[] args)
{
List<int> ltemp = new List<int> { 1, 23, 4, 5, 6 };
var res = ltemp
.Where(a => { return a > 4; })
.Sum();
Console.WriteLine(res);
Console.ReadKey();
}
}
}
<1>上面的代码中用了两个拓展方法。
Where拓展方法,需要传入一个Func<int,bool>类型的泛型委托,此泛型委托,需要一个int的输入参数和一个bool类型的返回值。
<2>Sum拓展方法计算了Where拓展方法返回的集合的和
(3)好处
上面的代码中
ltemp
.Where(a => { return a > 4; })
.Sum();
上面的一句可以完全写成
(from v in arr where v > 3 select v).Sum();
(4)标准查询操作符说明
<1>过滤
Where
用法:arr.Where(a=>{ return a>3; })
说明:找到集合中满足指定条件的元素
OfType
用法:arr.OfType<int>()
说明:根据类型,筛选集合中的元素
<2>投影
Select
用法:arr.Select<int,string>(a=>a.ToString());
说明:将集合中的每个元素投影到进的集合中。上例子中新集合是一个IEnumerable<String>的集合
SelectMany
用法arr.SelectMany<int,string>(a=>{return new List<string>(){a.Tostring();}};
查询表达式
(1)源起
查询早做副表示扩张方法来操作及和,虽然已经比较方便,但可读性和代码的语义来考虑,仍有不足,于是产生了查询表达式的写法。虽然很像SQL,但是用本质不同
(2)用法
from v in arr where v>3 select v
(3)说明:
... ...
参考文档:
https://blog.csdn.net/snakorse/article/details/44171295