应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

IEnumerable与IEnumerator区别

4641人阅读 2016/12/20 10:11 总访问:5182398 评论:0 收藏:0 手机
分类: .NET



IEnumerable:可枚举。

IEnumerator:一种枚举方案。

如果你想使用枚举,就必须实现接口IEnumerable的方法GetEnumerator(),但是这个方法

返回类型是IEnumerator,他才是真正的实现枚举的功臣,因此要枚举的容器就必须实现

IEnumerator的方法和属性。IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。

微软官方的一个例子:

  1. using System;
  2. using System.Collections;
  3. public class Person
  4. {
  5.     public Person(string fName, string lName)
  6.     {
  7.         this.firstName = fName;
  8.         this.lastName = lName;
  9.     }
  10.     public string firstName;
  11.     public string lastName;
  12. }
  13. public class People : IEnumerable
  14. {
  15.     private Person[] _people;
  16.     public People(Person[] pArray)
  17.     {
  18.         _people = new Person[pArray.Length];
  19.         for (int i = 0; i < pArray.Length; i++)
  20.         {
  21.             _people[i] = pArray[i];
  22.         }
  23.     }
  24.     IEnumerator IEnumerable.GetEnumerator()
  25.     {
  26.        return (IEnumerator) GetEnumerator();
  27.     }
  28.     public PeopleEnum GetEnumerator()
  29.     {
  30.         return new PeopleEnum(_people);
  31.     }
  32. }
  33. public class PeopleEnum : IEnumerator
  34. {
  35.     public Person[] _people;
  36.     // Enumerators are positioned before the first element
  37.     // until the first MoveNext() call.
  38.     int position = -1;
  39.     public PeopleEnum(Person[] list)
  40.     {
  41.         _people = list;
  42.     }
  43.     public bool MoveNext()
  44.     {
  45.         position++;
  46.         return (position < _people.Length);
  47.     }
  48.     public void Reset()
  49.     {
  50.         position = -1;
  51.     }
  52.     object IEnumerator.Current
  53.     {
  54.         get
  55.         {
  56.             return Current;
  57.         }
  58.     }
  59.     public Person Current
  60.     {
  61.         get
  62.         {
  63.             try
  64.             {
  65.                 return _people[position];
  66.             }
  67.             catch (IndexOutOfRangeException)
  68.             {
  69.                 throw new InvalidOperationException();
  70.             }
  71.         }
  72.     }
  73. }
  74. class App
  75. {
  76.     static void Main()
  77.     {
  78.         Person[] peopleArray = new Person[3]
  79.         {
  80.             new Person("John""Smith"),
  81.             new Person("Jim""Johnson"),
  82.             new Person("Sue""Rabon"),
  83.         };
  84.         People peopleList = new People(peopleArray);
  85.         foreach (Person p in peopleList)
  86.             Console.WriteLine(p.firstName + " " + p.lastName);
  87.     }
  88. }


People 实现 IEnumerable ,说明People是可以枚举的,但是怎么枚举呢?

PeopleEnum 实现 IEnumerator ,真正的实现了枚举。他们通过GetEnumerator建立联系。



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

关于IEnumerable使用Append追加元素的一个小坑

在使用IEnumerable的Append方法追加元素时:classProgram{ staticvoidMain(string[]args){ // //摘要: //Appendsavalue...

分布式服务架构微服务架构概念的区别联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

jsController中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

Service-stack.redis配置连接池读写分离(处理并发相关等)

配置连接池与读写分类 //写节点(主节点) List&lt;string&gt;writes=newList&lt;string&gt;(); writes.Add(&quot;123456a...

CSS相对定位绝对定位

一般相对定位和绝对定位可以配合起来使用 例如实现如下的效果 只需要在外层div设置为相对定位,在内部设置为绝对定位就...

C委托事件

1.什么是委托?  委托在C#里的意义和在现实里差不多,从字面意思理解即可。举个例子:领导委托小张去传递个文件,这就是...

asp.net core2.0 依赖注入 AddTransientAddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

Vue.js+Layer实现表格数据绑定更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

下划线、换行、回车、空格ASCII码值对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

数据读取器指定的"xx"不兼容。某个类型为"xx"的成员在同名的数据读取器中没有对应的列

报错的地方var result= _db.Database.SqlQuery&lt;SMachine&gt;(sql).FirstOrDefault();经过分析,是因为SqlQuery方法查询...

git 下载提交命令

一.先使用git clone下载一个项目 git clone &#39;项目地址&#39; 这里要注意: clone的项目里边会自带git的一些信息,...

微信开发四 接受用户普通消息回复消息

微信接收用户普通消息的文章可以在官方中直接看微信普通消息分类:接受用户文本消息 与 回复文本信息 注意在接收用户普通...

记忆糖的关系【阅读听力】

Link Between Memory and SugarSugar On The BrainIt’s long been understood that there is a connection between memory...

婚姻心脏健康的关系【阅读听力】

Marriage and Heart HealthPlenty of studies have found that being married is generally good for health. One study ze...

iframe自适应高度配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...