能用foreach遍历访问的对象需要实现____接口或声明____方法的类型
之前面试看到一个这样的笔试题,当时只知道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遍历访问的对象需要实现____接口或声明____方法的类型相关推荐
- java中foreach怎么访问,Java对象阵列Foreach方法访问
在 PHP开发很长一段时间后,我决定进入Java.在OOP方法和所有这些方面很舒服,我试图在java中开始这一点,但是我已经挂断了将我的arraylist对象传递给for语句,使用Item类方法打印出 ...
- html中foreach遍历list,foreach遍历----for(object o: list)
Foreach遍历 前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable,代码如下: foreach (Orde .. ...
- Foreach遍历原理
Foreach遍历原理 任何集合类(Array)对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象. 这个返回的IEnumerator对象既不是 ...
- c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象
一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...
- Java学习总结:55(偶对象保存:Map接口)
偶对象保存:Map接口 我们前面讲到的Collection属于单值保存父接口,每次只能保存一个对象:而我们这节讲的Map属于偶对象保存接口,利用Map可以保存一对关联数据(按照"key = ...
- 使用foreach遍历对象
PHP5起可以使用foreach遍历对象,但受访问权限的影响. <?php class MyClass {public $var1 = 'value 1';public $var2 = 'val ...
- python迭代函数例题_python map 函数使用,遍历访问可迭代对象
1. 功能介绍 map 调用函数遍历可迭代对象,返回一个迭代器对象 map(function, iterable, ...) 可以传递多个迭代器对象给 map 的迭代函数,这个函数接收参数的个数必须和 ...
- C++之string类(2):三种访问遍历string类对象的方式
目录 前言 1. 下标+[] 1.1 代码实现 1.2 细节解析 1.3 题目应用 2. 迭代器 2.1 begin+end 正向迭代器 2.1.1 代码实现 2.1.2 细节解析 2.2 反向迭代器 ...
- 对象遍历(对象forEach遍历)
对象遍历(对象forEach遍历) 对象遍历 对象fon in 遍历 对象keys 遍历 对象values 遍历 对象getOwnPropertyNames遍历 使用Reflect.ownKeys(o ...
最新文章
- mysql卸载后root还在_TMD终于把MySQL卸载掉了
- 北京建委breaa.cn宕了
- PHP设置块注释的模板
- 危!我用python克隆了女朋友的声音!
- textView不能完全显示时,滚动显示
- CentOS查看和修改PATH环境变量的方法
- 使用 IPsec 与组策略隔离服务器和域-第 7 章 IPsec 疑难解答
- antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
- java游戏怎么设置背景色_java-将背景色设置为JButton
- python之字典方法
- pulsar 卸载数据到aws-s3
- 用计算机乘九位数怎么用,用计算器计算
- Linux 文件类型!
- 网上商城系统源码 B2C电子商务系统源码
- YARN 作业执行流程
- cpufreq 频率设置verify
- python金融大数据分析师工资待遇_国内数据分析待遇如何?
- css3新动_10款重量级CSS3的全新特效 实现超酷前端动画效果
- vue 表单验证正则_vue表单验证
- QT 如何去除QListView选中item后的虚线框