如何让一个类可以被foreach枚举?
答:实现IEnumerable或其IEnumerable<T>。该接口只有一个函数 public IEnumerator GetEnumerator();
在这里,IEnumerator也是一个接口,我们将实现该接口的类称之为枚举数(enumerator)。
也就是说,任何一个可以被枚举的类型,都可以通过GetEnumerator()得到这个枚举数;反过来,任何一个类型,若想要其能被枚举,那么必须实现IEnumerator接口的GetEnumerator()方法。
那么,如何实现GetEnumerator?
下面是三个版本的例子
例子1:非泛型
class Program
{
static void Main(string[] args)
{ MyColors myColors=new MyColors();
foreach (var myColor in myColors)
{
Console.WriteLine(myColor);
}
Console.Read(); }
}
class ColorEnumerator : IEnumerator
{
private string[] Colors;
int position = -;
public bool MoveNext()
{
position++;
if (position<Colors.Count())
{
return true;
}
return false;
} public void Reset()
{
position = -; }
public object Current { get { return Colors[position]; } }
public ColorEnumerator(string[] theColors)
{
Colors = new string[theColors.Count()];
for (int i = ; i < theColors.Count(); i++)
{
Colors[i] = theColors[i];
}
} }
class MyColors : IEnumerable
{
private string[] Colors = {"Red","Yellow","Blue"};
public IEnumerator GetEnumerator()
{
return new ColorEnumerator(Colors);
}
}
例子二(泛型的方法):
class ColorEnumerator : IEnumerator<string>
{
private string[] Colors;
int position = -;
public bool MoveNext()
{
position++;
if (position<Colors.Count())
{
return true;
}
return false;
} public void Reset()
{
position = -; } object IEnumerator.Current
{
get { return Current; }
} public string Current
{
get { return Colors[position]; }
} public ColorEnumerator(string[] theColors)
{
Colors = new string[theColors.Count()];
for (int i = ; i < theColors.Count(); i++)
{
Colors[i] = theColors[i];
}
} public void Dispose()
{ }
}
class MyColors : IEnumerable<string>
{
private string[] Colors = { "Red", "Yellow", "Blue" }; public IEnumerator<string> GetEnumerator()
{
return new ColorEnumerator(Colors);
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{ MyColors myColors = new MyColors();
foreach (var color in myColors)
{
Console.WriteLine(color);
}
Console.Read();
}
}
例子三(迭代器方法):
class MyColors : IEnumerable
{ public IEnumerator GetEnumerator()
{
yield return "Blue";
yield return "Yellow";
yield return "Red";
} }
如何让一个类可以被foreach枚举?的更多相关文章
- PHP5实现foreach语言结构遍历一个类的实例
PHP5实现foreach语言结构遍历一个类 创建一个类集成Iterator接口,并实现Iterator里面的方法即可,下面见实例代码实现 <?php class Test implements ...
- 在PHP中检测一个类是否可以被foreach遍历
在PHP中,我们可以非常简单的判断一个变量是什么类型,也可以非常方便的确定一个数组的长度从而决定这个数组是否可以遍历.那么类呢?我们要如何知道这个类是否可以通过 foreach 来进行遍历呢?其实,P ...
- 手动写一个类支持foreach循环
之前初学时看过可以实现Iterable接口实现Iterator迭代器的支持,并且也支持foreach循环.现在学习了数据结构,手动写一个单链表支持foreach循环吧. 手写foreach循环步骤: ...
- c# foreach枚举器
要是自己的类支持foreach ,必须在类中必须有GetEnumerator方法,该方法返回的是一个IEnumerator类型的枚举器; public class MyStruct { public ...
- 遍历一个类的属性--并转换为Dictionary类型
参考地址...http://www.cnblogs.com/xwgli/p/3306297.html 记录点滴...以前很少用泛型...HaHa... /// <summary> /// ...
- yii2封装一个类控制div宽度,高度
1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试 function add() { r ...
- C#判断一个类中有无"指定名称"的方法
C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- 当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?
当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的 ...
随机推荐
- js中的逻辑与(&&)和逻辑或(||)
之前有一个同事去面试,面试过程中碰到这样一个问题: 在js中写出如下的答案 : var a = 2; var b = 3; var andflag = a && b ; var orf ...
- Bash 的 no-fork 优化
我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序.fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 ...
- R语言学习笔记-机器学习1-3章
在折腾完爬虫还有一些感兴趣的内容后,我最近在看用R语言进行简单机器学习的知识,主要参考了<机器学习-实用案例解析>这本书. 这本书是目前市面少有的,纯粹以R语言为基础讲解的机器学习知识,书 ...
- #define #include #undef的其中一个用法(目的)
一.背景 最近在跟一段系统级的代码,和原来单纯的下位机代码相比,真的是刘姥姥进大观园--看花了眼.相较于 之前所常见的各种下位机代码,系统级代码常常会出现深层次结构体嵌套,结构体内的各种回调函数导致对 ...
- PHP变量入门教程(2)超全局变量,总共9个
PHP 超全局变量 $GLOBALS 包含一个引用指向每个当前脚本的全局范围内有效的变量.该数组的键标为全局变量的 名称.从 PHP 3 开始存在 $GLOBALS 数组. $_SERVER 变量由 ...
- 浅谈JS之AJAX
0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...
- Microsoft.AspNet.SignalR 2.2
Nuget :http://www.nuget.org/packages/Microsoft.AspNet.SignalR/ What is SignalR? ASP.NET SignalR is a ...
- Java实现JDBC连接数据库实例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- tp5 中 model 的查询方法
实例化模型后调用查询方法,可以写任何想要的查询(推荐) public function select(){ $user = model('User'); $data = $user -> ) - ...
- 【linux】su、sudo、sudo su、sudo -i的用法和区别
来源:http://bbs.csdn.net/topics/390938651 sudo : 暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.不过 ...