代码中常常遇到迭代数据集合的状况,当但愿获取到一个IEnumerable<T>类型的集合,而又不想把数据一次性加载到内存中时,express
能够考虑使用yield,yield关键字可实现用户的按需获取数据,延时加载数据。this
举例说明在实现同一个功能时,使用yield和不使用yield的区别:spa
1. 在不使用yield关键字迭代数据时代码以下:调试
public static IEnumerable<T> QueryExtention<T>(this MyCollection<T> source, Expression<Func<T, bool>> expression) { IList<T> result = new List<T>(); foreach (var item in source) { if (expression.Compile()(item)) result.Add(item); } return result; }
2. 使用yield关键字迭代数据时代码以下:code
public static IEnumerable<T> QueryExtention<T>(this MyCollection<T> source, Expression<Func<T, bool>> expression) { foreach (var item in source) { if (expression.Compile()(item)) yield return item; } }
由上面例子能够看出,在不使用yield关键字时,迭代一个数据集合将首先建立一个集合,而后迭代数据,将符合条件的数据添加blog
到新建立的集合中,最后迭代完毕后返回新集合;内存
使用yield的关键字时则不须要建立一个新的集合,而且调试代码会发现实际上面的扩展方法在执行结束后并未返回符合条件的数据it
集合,而是返回了一个迭代器,在使用foreach关键字遍历迭代器时,一条一条返回符合条件的数据io