代碼中常常遇到迭代數據集合的狀況,當但願獲取到一個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