我在2011年9月发表了一个问问,http://q.cnblogs.com/q/28679/

没人理我。

自己看了一下,尝试自己解决:

原问题:
MSDN:

在非泛型集合中,您可以在调用 Reset 后调用 MoveNext,将枚举数移回集合的开始处。

在泛型集合中,您不能再将 Current 设置为集合的第一个元素;而须创建新的枚举数实例。

------------------------

一个复杂的Linq 变量停难定义的,有时候要重复使用几次,但是MSDN里面说要重新创建,难道又要书写一次linq代码么?或者产生拷贝就可以?

请给出重复使用该枚举变量的解决方案。

另外:

MSDN:

只要该集合保持不变,枚举数也就保持有效。如果对该集合进行了更改(例如添加、修改或删除了元素),该枚举数将失效(这一变化是不可逆转的),且其行为将变为未定义。

--------------------------------

假设我定义了一个枚举数,但是还没使用,然后数据源发生变化,我这个枚举数就没有用了么?

为什么泛型集合没有Reset的实现?我认为是有些数据源回到首个元素比较浪费性能,甚至不可能,比如网络流。

枚举变量要求源不可以变,因为枚举变量是一个位置信息,源结构发生变化,增加或者减少,位置信息很可能变得没有意义,但不是一定。

观察一下枚举器的一般实现(yield生成代码),首先是在数据源里面产生一个内部类(枚举器),当foreach 调用数据源的GetEnumerator(), new 这个内部类的实例,该实例就保存了当前数据源中位置信息。其他自定义的数据源也是类似的原理。

当源发生变化,位置信息没有义务要发生相应的变化,这不是设计规范,大部分实现可以做到,但是也不排除特殊情况,而数据源的设计是一个高度适用的方案,因此无法保证修改后位置信息还是有效的。

第二个问题是,如何重复使用枚举器。枚举器是一个不断MoveNext的位置变量,不能往回走,提出这个问题本身就不是一个好的问题。为何当初我会提出,主要是我没有理解枚举器的实现机制,没有将linQ语句和产生枚举器这点区分开来,我以为书写一个复杂的linQ语句,产生一个枚举器之后,这个语句又要重新书写。那是因为没有理解foreach 调用了数据源的GetEnumerator()函数,这个函数创建了一个全新的枚举器,也就是根本可以直接使用这个数据源,重用这段linQ语句,foreach会产生全新的枚举器,不需要我担心。

如何重复使用IEnumerable对象来枚举?的更多相关文章

  1. C#去除List中集合的重复项(类型对象和单一类型)

    去除重复类型对象BookInfo示例: bookList = bookList.Distinct(new DataRowComparer()).ToList(); //去除重复书籍 /// <s ...

  2. 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )

    下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口: using System; using System.Collections; using Syst ...

  3. day 13 迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象

    迭代器大概念 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值​# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值( ...

  4. Spring MVC 自动为对象注入枚举类型

    原文地址:http://1358440610-qq-com.iteye.com/blog/2079048 如果一个对象里面有枚举类型的话,则Spring MVC是不能够直接进行注入的,因为它只实现了一 ...

  5. C#中DataTable与泛型集合互转(支持泛型集合中对象包含枚举)

    最近在做WCF,因为是内部接口,很多地方直接用的弱类型返回(DataSet),这其实是一种非常不好的方式,最近将项目做了修改,将所有接口返回值都修改成强类型,这样可以减少很多与客户端开发人员的沟通,结 ...

  6. js 对象可枚举属性以及for in 循环和for of 循环

    js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性). ...

  7. js对象属性—枚举、检查、删除

    前言 我们经常需要操作对象的属性.这里记录ES5中操作对象属性的API和它们之间的差异. 枚举属性 for/in遍历对象中的所有可枚举属性(包括自有属性和继承属性) var obj = {name:& ...

  8. 快学Scala 第九课 (伴生对象和枚举)

    Scala没有静态方法和静态字段, 你可以用object这个语法结构来达到同样的目的. 对象的构造器只有在第一次被使用时才调用. 伴生对象apply方法: 类和它的伴生对象可以互相访问私有特性,他们必 ...

  9. python之迭代器、可迭代对象、生成器、生成器对象、枚举类型

    迭代器 # 迭代器:循环反馈的容器(集合类型)# -- 不同于索引取值,但也可以循环的从容器对象中从前往后逐个返回内部的值​# 优点:不依赖索引,完成取值# 缺点:不能计算长度,不能指定位取值(只能从 ...

随机推荐

  1. ae 地理坐标与投影坐标转换 [转]

    转载地址:http://blog.163.com/lai_xiao_hui/blog/static/123037324201151443221942/ 代码是将WGS84地理坐标转换为WGS84UTM ...

  2. CentOS桌面安装

    1.显示系统已经安装的组件,和可以安装的组件: #yum grouplist 2.如果系统安装之初采用最小化安装,没有安装xwindow,那么先安装: #yum groupinstall " ...

  3. SharePoint 2013 图文开发系列之自定义字段

    SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应用中,我们还需要一些功能特殊的字段,下面,我们简单介绍下字段的开 ...

  4. Android自定义控件(二)

    这一篇主要来讲一下自定义控件中的自定义viewgroup,我们以项目中最常用的下拉刷新和加载更多组件为例 简单介绍一下自定义viewgroup时应该怎么做. 分析:下拉刷新和加载更多的原理和步骤 自定 ...

  5. 使用SQL Server 扩展事件来创建死锁的时间跟踪

    我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪. 步骤1: 通过“Object Explorer”连接 ...

  6. .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

    阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...

  7. js获取浏览器内核、类型、版本以及系统类型

    正则表达式: var rsys = /\b(windows|win32|macintosh|mac os x|adobeair|linux|unix)\b/; var rkn = /\b(opera| ...

  8. 【hive】——metastore的三种模式

    Hive中metastore(元数据存储)的三种方式: 内嵌Derby方式 Local方式 Remote方式 [一].内嵌Derby方式 这个是Hive默认的启动模式,一般用于单元测试,这种存储方式有 ...

  9. Node Pm2 配置

    系统环境:Centos7 第一步安装NodeJS 建议采用稳定编译过的版本,source code稍麻烦,编译过的直接可用,安装超级简单 下载完成后安装成功 node -v 显示版本号 npm -v ...

  10. Service 广播 到Fragment

    //Fragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Sys ...