yield迭代器的使用

class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>();
            for (int i = 0; i < 10; i++)
            {
                students.Add(new Student() { Age = i, Name = "名字" + i });
            }

            {
                Console.WriteLine("********************未使用迭代器 Start*****************************");
                List<Student> query = students.WhereNoYield(s =>
                {
                    Thread.Sleep(300);
                    return s.Age > 0;
                });
                foreach (var item in query)
                {
                    Console.WriteLine($"{DateTime.Now} - {item.Age} - {item.Name}");
                }
                Console.WriteLine("********************未使用迭代器 End*****************************");
            }


            {
                Console.WriteLine("********************使用迭代器 Start*****************************");
                IEnumerable<Student> query = students.WhereWithYield(s =>
                {
                    Thread.Sleep(300);
                    return s.Age > 0;
                });
                foreach (var item in query)
                {
                    Console.WriteLine($"{DateTime.Now} - {item.Age} - {item.Name}");
                }
                Console.WriteLine("********************使用迭代器 End*****************************");
            }

            Console.ReadKey();
        }
    }

    public static class MyClass
    {
        public static IEnumerable<T> WhereWithYield<T>(this IEnumerable<T> list, Func<T, bool> func)
        {
            foreach (var item in list)
            {
                if (func.Invoke(item))
                {
                    yield return item;
                }
            }
        }

        public static List<T> WhereNoYield<T>(this List<T> list, Func<T, bool> func)
        {
            List<T> lists = new List<T>();
            foreach (var item in list)
            {
                if (func.Invoke(item))
                {
                    lists.Add(item);
                }
            }
            return lists;
        }
    }

    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

通过运行结果时间可以看出:

未使用迭代器,等待“WhereNoYield”函数运算完成后,再进行打印数据

使用迭代器,每次执行“WhereWithYield“函数时,会直接打印数据

posted @ 2019-08-25 01:46  李树逸  阅读(308)  评论(0编辑  收藏  举报