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;
             }
         }
     }
}

转载于:https://www.cnblogs.com/xtxtx/p/9207205.html

学习笔记: yield迭代器相关推荐

  1. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  2. Python学习笔记之迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  3. C# 学习笔记:迭代器

    C#中,如果实现遍历一个数组,除了for循环,还可以是foreach循环.在foreach循环中,我们只需要创建一个同类型的值,来表示我们遍历后的值就可以了.但是实际上,只有实现了IEnumerabl ...

  4. python学习笔记之迭代器

    # 迭代器的概念# 迭代器协议 -- 内部含有__next__和__iter__方法的就是迭代器 # 迭代器协议和可迭代协议# 可以被for循环的都是可迭代的# 可迭代的内部都有__iter__方法# ...

  5. 【C++学习笔记】迭代器和数组

    一.迭代器   在string对象或vector对象中我们可以使用下标运算符来访问其中的字符,除此外,还有一种更通用的机制也可以实现这样的目的,即迭代器(iterator). 1.1 使用迭代器    ...

  6. OpenMesh学习笔记4 迭代器和循环器

    迭代器和循环器 迭代器 OpenMesh提供了遍历网格元素(点,半边,边,面)的迭代器. 所有的迭代器都定义在命名空间OpenMesh::Iterators中的模板类,需要一个具体的网格对象(即已经初 ...

  7. 设计模式学习笔记汇总目录

    这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...

  8. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  9. java it_关于 Java Iterator(迭代器)学习笔记

    相信 "迭代" 对于Java程序员来说并不陌生(当然,其他语言的程序员也是如此),在处理数据时,不可避免地会存在对数据的大量遍历操作.对于我自己而言,学习使用Java语言两年时间, ...

  10. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

最新文章

  1. php 实现一致性hash 算法 memcache
  2. 【杂谈】有三AI知识星球最近都GAN了哪些内容?
  3. 修改了一下voddown.py
  4. 实现日志管理的两种方式:aop、拦截器
  5. 每日一题:leetcode1128.等价多米诺骨牌对数
  6. stlink 升级固件以后失败_ST-Link不能下载程序的几种解决办法
  7. windows复制文件到 vmware centos虚拟机问题
  8. SPFieldLookupValue
  9. 大数据挖掘有哪些技术
  10. Apache APR可移植运行库简介(4)
  11. python文本框_Python GUI-在文本框中插入文本
  12. iPhone/iPad/Android UI尺寸规范 手机尺寸
  13. SAN 光纤交换机配置zone实验
  14. [译]const T vs. T const ——Dan Saks 【翻译】
  15. [CTO札记]新产品出现时,要‘耐得住寂寞,抗得住压力’
  16. 织梦免费网站模板手机端无法更新的原因及解决
  17. win10-gvim安装vim-airline后状态栏乱码,而且箭头显示不出来
  18. 发票管理系统java_企业发票管理系统.doc
  19. 教会微信:突破文件发送100M限制
  20. 标称型和数值型的区别

热门文章

  1. idea的文件可以mysql运行吗,终于将tiny-sdpm+intellij idea+mysql+jettyt运行成功
  2. mysql 使用gzip 压缩 文件,本地对 gzip 压缩的文件解压缩
  3. SpingMVC 注解@RequestMapping、@SuppressWarnings、@Scheduled 定时器
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_13-MongoDb入门-数据库和集合...
  5. 阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
  6. MFC在一个工程中启动其他工程的exe文件
  7. python学习笔记(十二)-- if __name__ == '__main__'
  8. SQL datediff()函数 时间差
  9. 自己做了个微信小程序
  10. Spark standalone运行模式(图文详解)