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

}

学习笔记: yield迭代器的更多相关文章

  1. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...

  2. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  3. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  4. Python学习笔记010_迭代器_生成器

     迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...

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

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

  6. python 3.x 学习笔记6 ( 迭代器 and 生成器 )

    1.迭代器(Iterator):   可以被next()函数调用并不断返回下一个值的对象,成为迭代器:Iterator  可以直接用于for 循环的对象统称为可迭代对象:Iterable 迭代,顾名思 ...

  7. Python学习笔记:迭代器(Iterator)详解

    一.可迭代的对象(Iterable) 1.定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器), 和带yield的函数,这些直接可以用在 ...

  8. C++学习笔记之迭代器

    模板是的算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型.理解迭代器是理解STL的关键. 迭代器应该具备的特征: (1)应该能够对迭代器进行解除引用的操作,以便能够访问它引用的值.即如果P ...

  9. Python学习笔记014——迭代器 Iterator

    1 迭代器的定义 凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator) 2 迭代器的说明 Python中的Iterator对象表示的是一个数据流,被函数next()函数 ...

随机推荐

  1. c提高第三次作业

    1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...

  2. c语言提高第二天

    一.指针强化1.指针也是一种数据类型,指针变量也是一种变量,和int a本质是一样的 1)指针变量也是一种变量,也有空间,32位程序大小为4个字节 int *p = 0x1122; 2)*操作符,*相 ...

  3. UIAutomator简介

    简介 Android 4.3发布的时候包含了一种新的测试工具–uiautomator,uiautomator是用来做UI测试的.也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期.比如 ...

  4. Qt如何去掉按钮等控件的虚线框(焦点框)

    方法1:可以通过代码ui->pushButton->setFocusPolicy(Qt::NoFocus)或在Qt Creator的属性列表中设置. 方法2:如果在嵌入式设备中需要通过按键 ...

  5. ☆ [WC2006] 水管局长 「LCT动态维护最小生成树」

    题目类型:\(LCT\)动态维护最小生成树 传送门:>Here< 题意:给出一张简单无向图,要求找到两点间的一条路径,使其最长边最小.同时有删边操作 解题思路 两点间路径的最长边最小,也就 ...

  6. vue数组中对象属性变化页面不渲染问题

    问题引入 Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化.但是,对于数组元素的赋值,却没有办法 ...

  7. 监控MySQL|Redis|MongoDB的执行语句(go-sniffer)

    上节回顾:https://www.cnblogs.com/dotnetcrazy/p/9986873.html 以CentOS为例: 1.环境 PS:如果不需要Golang环境,可以编译后把执行文件c ...

  8. java 11 标准Java异步HTTP客户端

    这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到 ...

  9. 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题

    #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...

  10. 09--STL关联容器(map/multimap)

    一:map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...