zoukankan      html  css  js  c++  java
  • 学习笔记: yield迭代器

    yield 与 IEnumerable<T> 结对出现, 可实现按需获取 , 迭代器模式

    static void Main(string[] args)
             {
                 try
                 {
                     {
                         //Console.WriteLine("***************Collection**************");
                         CollectionDemo.Show();
                     }
                     {
                         Console.WriteLine("*******************Yield********************");
                         YieldDemo yieldDemo = new YieldDemo();
                         foreach (var item in yieldDemo.Power())
                         {
                             Console.WriteLine(item);//按需获取,要一个拿一个
                             if (item > 100)
                                 break;
                         }
                         Console.WriteLine("*******************************************");
                         foreach (var item in yieldDemo.Common())
                         {
                             Console.WriteLine(yieldDemo.Common().Count());//先全部获取,然后一起返还
                             if (item > 100)
                                 break;
                         }
                     }

    {
         List<string> fruits =
         new List<string> { "apple", "passionfruit", "banana", "mango",
             "orange", "blueberry", "grape", "strawberry" };

        IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
         foreach (var item in query)//遍历才会去查询比较   迭代器 yield
         {

        }

        IQueryable<string> queryable = fruits.AsQueryable<string>().Where(s => s.Length <6);
         foreach (var item in queryable)//表达式目录树的解析,延迟到遍历的时候才去执行  EF的延迟查询
         {

        }
    }
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message);
                 }
                 Console.Read();
             }

    public class YieldDemo
    {
         public IEnumerable<int> Power()
         {
             for (int i = 0; i < 10; i++)
             {
                 yield return this.Get(i);
                 //yield return this.Get(i);

                //Console.WriteLine("这里再来一次");

                //yield return this.Get(i) + 1;
             }
         }

        public IEnumerable<int> Common()
         {
             List<int> intList = new List<int>();
             for (int i = 0; i < 10; i++)
             {
                 intList.Add(this.Get(i));
             }
             return intList;
         }

        private int Get(int num)
         {
             Thread.Sleep(2000);
             return num * DateTime.Now.Second;
         }


    }

    public static class ExtendMethod
    {
         public static IEnumerable<T> ElevenWhere<T>(this IEnumerable<T> source, Func<T, bool> func)
         {
             if (source == null)
             {
                 throw new Exception("source is null");
             }
             if (func == null)
             {
                 throw new Exception("func is null");
             }
             foreach (var item in source)
             {
                 if (func.Invoke(item))
                 {
                     yield return item;
                 }
             }
         }
    }

  • 相关阅读:
    codeforces 650B
    2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity
    2013 ACM区域赛长沙 I LIKE vs CANDLE(ZOJ3734) 很好的一道树形DP
    Codeforces Round #306 (Div. 2)——A——Two Substrings
    Codeforces Round #306 (Div. 2)——B暴力——Preparing Olympiad
    HDU5248——二分查找——序列变换
    HDU2255——KM算法——奔小康赚大钱
    匈牙利算法&KM算法
    HDU1059——多重部分和问题——Dividing
    HDU1058——Humble Numbers
  • 原文地址:https://www.cnblogs.com/xtxtx/p/9207205.html
Copyright © 2011-2022 走看看