C#语法糖yield
代码中经常遇到迭代数据集合的情况,当希望获取到一个IEnumerable<T>类型的集合,而又不想把数据一次性加载到内存中时,
可以考虑使用yield,yield关键字可实现用户的按需获取数据,延时加载数据。
举例说明在实现同一个功能时,使用yield和不使用yield的区别:
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关键字迭代数据时代码如下:
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关键字时,迭代一个数据集合将首先创建一个集合,然后迭代数据,将符合条件的数据添加
到新创建的集合中,最后迭代完毕后返回新集合;
使用yield的关键字时则不需要创建一个新的集合,并且调试代码会发现实际上面的扩展方法在执行结束后并未返回符合条件的数据
集合,而是返回了一个迭代器,在使用foreach关键字遍历迭代器时,一条一条返回符合条件的数据