zoukankan      html  css  js  c++  java
  • C# yield return 用法与解析

    C# yield return 用法与解析

    本文参考自:http://www.jb51.net/article/54810.htm

     

     当初没有认真理解 yield 这个关键字,现在又遇到了依旧不理解,为了以后不再为了 yield 困惑,决定好好研究一下 yield 的用法与意义:

    yield 从字面上理解有“退位,屈服”的意思,转一下弯就理解成“权限转移”,也就是将控制权交给别人,在这里就是把集合里满足条件(如果没有过滤条件,就是全体)的个体的操作转移给另一个对象。

        class Program
        {
            static void Main(string[] args)
            {
                foreach (var item in FilterWithoutYield)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey(); 
            }
    
    
            //申明属性,定义数据来源
            public static List<int> Data
            {
                get
                {
                    return new List<int>(){1,2,3,4,5,6,7,8};
                }
            }
    
            //申明属性,过滤器(不适用yield)
            public static IEnumerable<int> FilterWithoutYield
            {
                get
                {
                    var result = new List<int>();
                    foreach (var i in Data)
                    {
                        if (i > 4)
                            result.Add(i);
                    }
                    return result;
                }
            }
        }

    可以看到如果不用yield,要返回大于4的所有的树,就要到另一个集合。而用yield的情况下就不必如此麻烦了:

            //申明属性,过滤器(使用yield)
            public static IEnumerable<int> FilterWithoutYield
            {
                get
                {
                    foreach (var i in Data)
                    {
                        if (i > 4)
                            yield return i;
                    }
                }
            }

    为什么会这样呢?

    通过单步调试发现:

    虽然2种方法的输出结果是一样的,但运作过程迥然不同。第一种方法,是把结果集全部加载到内存中再遍历;第二种方法,客户端每调用一次,yield return就返回一个值给客户端,是"按需供给"。

    第一种方法,客户端调用过程大致为:

    使用yield return,客户端调用过程大致为:

    使用yield return为什么能保证每次循环遍历的时候从前一次停止的地方开始执行呢?

    --因为,编译器会生成一个状态机来维护迭代器的状态。

    简单地说,当希望获取一个IEnumerable<T>类型的集合,而不想把数据一次性加载到内存,就可以考虑使用yield return实现"按需供给"。

  • 相关阅读:
    C++学习9 this指针详解
    福建省第八届 Triangles
    UVA 11584 Partitioning by Palindromes
    POJ 2752 Seek the Name, Seek the Fame
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    HDU 2988 Dark roads(kruskal模板题)
    HDU 1385 Minimum Transport Cost
    HDU 2112 HDU Today
    HDU 1548 A strange lift(最短路&&bfs)
  • 原文地址:https://www.cnblogs.com/SilentCode/p/5014068.html
Copyright © 2011-2022 走看看