之前面试看到一个这样的笔试题,当时只知道List和Dictionary类型可以用foreach遍历,但他两也没什么共同点啊。List是有序的,但Dictionary是无序的。回来在网上查了下才发现,他们都实现了IEnumerable接口,申明了GetEnumerator方法。打开源码后发现确实如此:

接下来就详细写一下自定义的类如果用foreach遍历。

首先定义一个Item类

public class Item
{public int Id;public string Name;public int Price;public Item(int id, string name, int price){Id = id;Name = name;Price = price;}
}

接下来要写的类就是暴漏给外部调用,实现了IEnumerable的ItemList.

public class ItemList : IEnumerable
{private Item[] items;public int Count{get { return items.Length; }}public ItemList(Item[] _items){items = _items;}public Item this[int index]{get { return items[index]; }}public IEnumerator GetEnumerator(){for (int i = 0; i < items.Length; i++){yield return items[i];}}//public IEnumerator GetEnumerator()//{//    return items.GetEnumerator();//}
}

这里可以不实现IEnumerable接口,但是GetEnumerator方法必须申明,不然在调用时会报错。而GetEnumerator方法,这里写了前两种方法。一种是通过for循环依次返回,一种是因为[]本身就实现了IEnumerable,所有可以直接用它的GetEnumerator。

然后写一个测试代码:

ItemList itemList=new ItemList(new Item[]{new Item(1,"apple",3),new Item(2,"banana",3)  });foreach (Item item in itemList){Debug.Log(item.Id+"__"+item.Name+"__"+item.Price);}

这样就可以通过foreach遍历自己写的ItemList类了。

还有第三种方法,就是自己重写一个实现IEnumerator的类

public class ItemListEnumerator : IEnumerator
{private int index = -1;private ItemList itemList;public ItemListEnumerator(ItemList _itemList){itemList = _itemList;}public object Current{get { return itemList[index]; }}public bool MoveNext(){index++;return index < itemList.Count;}public void Reset(){index = -1;}
}

然后修改ItemList中的GetEnumerator方法

  public IEnumerator GetEnumerator(){return new ItemListEnumerator(this);}

至此让一个自定义类可以被foreach遍历的三种方法都有了。而写到这里,对IEnumerator做一些猜想。因为在写协程时,返回的参数同样是IEnumerator类型。而这里相当于每调用一次,就像Next实现的一样,把指针指向了下一个元素。再深究,感觉就是IEnumerator自身到底是一个什么类型的东西了,起什么作用。

最后附上两个链接,我这篇相当于对这两位笔者博文的结合。

https://blog.csdn.net/qq_39081464/article/details/81023878

https://blog.csdn.net/zfq18317916225/article/details/50717751

能用foreach遍历访问的对象需要实现____接口或声明____方法的类型相关推荐

  1. java中foreach怎么访问,Java对象阵列Foreach方法访问

    在 PHP开发很长一段时间后,我决定进入Java.在OOP方法和所有这些方面很舒服,我试图在java中开始这一点,但是我已经挂断了将我的arraylist对象传递给for语句,使用Item类方法打印出 ...

  2. html中foreach遍历list,foreach遍历----for(object o: list)

    Foreach遍历 前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable,代码如下: foreach (Orde .. ...

  3. Foreach遍历原理

    Foreach遍历原理 任何集合类(Array)对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象. 这个返回的IEnumerator对象既不是 ...

  4. c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

    一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...

  5. Java学习总结:55(偶对象保存:Map接口)

    偶对象保存:Map接口 我们前面讲到的Collection属于单值保存父接口,每次只能保存一个对象:而我们这节讲的Map属于偶对象保存接口,利用Map可以保存一对关联数据(按照"key = ...

  6. 使用foreach遍历对象

    PHP5起可以使用foreach遍历对象,但受访问权限的影响. <?php class MyClass {public $var1 = 'value 1';public $var2 = 'val ...

  7. python迭代函数例题_python map 函数使用,遍历访问可迭代对象

    1. 功能介绍 map 调用函数遍历可迭代对象,返回一个迭代器对象 map(function, iterable, ...) 可以传递多个迭代器对象给 map 的迭代函数,这个函数接收参数的个数必须和 ...

  8. C++之string类(2):三种访问遍历string类对象的方式

    目录 前言 1. 下标+[] 1.1 代码实现 1.2 细节解析 1.3 题目应用 2. 迭代器 2.1 begin+end 正向迭代器 2.1.1 代码实现 2.1.2 细节解析 2.2 反向迭代器 ...

  9. 对象遍历(对象forEach遍历)

    对象遍历(对象forEach遍历) 对象遍历 对象fon in 遍历 对象keys 遍历 对象values 遍历 对象getOwnPropertyNames遍历 使用Reflect.ownKeys(o ...

最新文章

  1. mysql卸载后root还在_TMD终于把MySQL卸载掉了
  2. 北京建委breaa.cn宕了
  3. PHP设置块注释的模板
  4. 危!我用python克隆了女朋友的声音!
  5. textView不能完全显示时,滚动显示
  6. CentOS查看和修改PATH环境变量的方法
  7. 使用 IPsec 与组策略隔离服务器和域-第 7 章 IPsec 疑难解答
  8. antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
  9. java游戏怎么设置背景色_java-将背景色设置为JButton
  10. python之字典方法
  11. pulsar 卸载数据到aws-s3
  12. 用计算机乘九位数怎么用,用计算器计算
  13. Linux 文件类型!
  14. 网上商城系统源码 B2C电子商务系统源码
  15. YARN 作业执行流程
  16. cpufreq 频率设置verify
  17. python金融大数据分析师工资待遇_国内数据分析待遇如何?
  18. css3新动_10款重量级CSS3的全新特效 实现超酷前端动画效果
  19. vue 表单验证正则_vue表单验证
  20. QT 如何去除QListView选中item后的虚线框

热门文章

  1. 序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)
  2. 命名时取代基优先顺序_有机物命名:常见官能团的优先次序表
  3. OIBH即将浴火重生
  4. (07)绘制形状与文字
  5. 分享10个接私活的网站
  6. 微信小程序开发(一):环境搭建和第一个小程序创建
  7. java字符串日期转换成数字,Java字符串到日期的转换
  8. 如何向外行解释:频繁改需求会令程序员炸毛?
  9. 一边学计算机一边上班累的说说,有关上班的心情说说,关于上班累的说说大全...
  10. 计算机科学导论阅读笔记