yield return 和 Func

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);
原文地址:https://www.cnblogs.com/Finding2013/p/3040604.html