yield return 用以生成IEnumerable类型的结果集,如下例所示,当第15行之行时,函数MyWhere并不会执行,而当第18行之行时会从第5行开始执行,在找到第一个偶数2时,函数MyWhere返回,执行第18行打印数字2,然后再调用第5行找到第二个偶数4,MyWhere又返回,继续执行第18行打印数字4。当执行到第22行时,函数MyWhere又会重新一次一次的执行。
MyWhere是为IEnumerable<T>类型定义的一个扩展方法,比如List<int>就是实现了IEnumerable的泛型方法,即可自动调用MyWhere这个扩展方法。
Func<T,bool> predicate表示predicate是一个可以指向一个有一个类型为T的参数且返回bool的匿名方法
1 static class MyExtendClass 2 { 3 public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate) 4 { 5 foreach (T obj in source) 6 if (predicate(obj)) 7 yield return obj; 8 } 9 } 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 List<int> myList = new List<int>() { 1, 2, 3, 4, 5, 6 }; 15 var queryint= myList.MyWhere(x => x % 2 == 0); 16 foreach (var item in queryint) 17 { 18 Console.Write(item); 19 } 20 foreach (var item in queryint) 21 { 22 Console.Write(item); 23 }
Func在.net中定义如下:
// 摘要: // 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。 // // 参数: // arg: // 此委托封装的方法的参数。 // // 类型参数: // T: // 此委托封装的方法的参数类型。 // // TResult: // 此委托封装的方法的返回值类型。 // // 返回结果: // 此委托封装的方法的返回值。 [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")] public delegate TResult Func<in T, out TResult>(T arg);