Foreach能够循环的本质
我们对foreach循环并不陌生,在C#中我们用得非常多,但是我们是否清楚foreach循环的本质呢? 众所周知,foreach循环能够遍历 数组 ,集合 。但是我们自己定义的一个类是否能够通过foreach循环遍历出来呢?
Foreach能够遍历的数据类型都是实现了 IEnumerable 接口的 意思就是说 只要我自定义的类实现了 IEnumberable接口 我都能够通过foreach来循环遍历
下面举一个简单的例子
首先自定义一个类 并实现 IEnumberable 接口
在Mylist类中,实现了IEnumberable接口后 必须 实现其中的 GetEnumberator()方法 而GetEnumberato方法中的返回值类型是 IEnumberator接口 类型
所以我们就自然而然想到了定义一个类 来实现 IEnumberator接口 利用里氏替换原则 返回子类类型
public class Mylist:IEnumerable
{
ArrayList list = new ArrayList();
//写一个自定义的Add方法()
public void Add(object ob)
{
list.Add(ob);
}
//实现IEnumerable接口的GetEnumerator()方法
public IEnumerator GetEnumerator()
{
return new MyTool(list);
}
}
/// <summary>
/// 实现 IEnumberyor接口时 必须实现该接口的 所有方法 即 Current() : 返回一个集合中的一项的值
/// MoveNext() : 系统自动调用MoveNext()方法
/// Reset() : 系统会在MoveNext方法返回一个false值的时候自动调用 将索引值重置
/// </summary>
public class MyTool : IEnumerator
{
ArrayList list = new ArrayList();
public MyTool(ArrayList li)
{
list=li;
}
int i = -;//给定初始位置 表示第一条数据之前
//Current属性
public object Current
{
get { return list[i]; }
} //自动调用MoveNext方法 调用下一条记录
public bool MoveNext()
{
bool Result = false;
if(i<list.Count-)
{
i++;
Result = true;
}
return Result;
} public void Reset()
{
i = -;
}
}
以上 foreach 循环的 本质 就是这些了
以下代码就是实现自定义类 用foreach循环实现
static void Main(string[] args)
{
Mylist list = new Mylist();
list.Add("张三");
list.Add("李四");
list.Add("王五"); foreach (object item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
Foreach能够循环的本质的更多相关文章
- 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历
建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...
- 7.15 迭代器 for循环的本质 生成器
迭代器 迭代:更新换代的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 作用 迭代器提供了一种不依赖于索引取值的方式 根据以上对于迭代的描述,如果只是简单的重复,不算迭代,如下: n ...
- C#的foreach遍历循环和隐式类型变量
C#的foreach遍历循环和隐式类型变量 foreach遍历循环 foreach (<baseType> <name> in <array>>) { //c ...
- Parallel.ForEach() 并行循环
现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...
- 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历
今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...
- JSP页面通过c:forEach标签循环遍历List集合
c:forEach>标签有如下属性: 属性 描述 是否必要 默认值items 要被循环的信息 否 无begin 开始的元素(0=第一个元素,1=第二个元素) 否 0end 最后一个元素(0=第一 ...
- php 在foreach中循环数组的时候添加元素的属性
foreach($arr as $k => &$v){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$v 赋值;如果不写&符号,下面这样写是没有 ...
- foreach控制循环if判断
<c:forEach items="${resultMap}" var="daily" varStatus="n"> <t ...
- foreach退出循环(新人请多多关照~)
今天做一个关于人员信息修改的页面时,我用foreach获取数据库数据时发现,用if else判断输入的内容时,会一个一个的做对比,导致错误提醒时会弹出与数据库内容行数相同条的提醒,最后发现将数据直接命 ...
随机推荐
- 安装 LuaSocket
如果你安装有 Lua 模块的安装和部署工具 -- LuaRocks,那么一条指令就能安装部署好 LuaSocket: luarocks install luasocket
- Unity5网络模块UNet介绍
前段时间,研究了一下UNet,经过项目实践,大致整理了下遇到的问题. 源码Bitbucket:需要说明的是,这个项目只包含上层的包装,一些低层的网络实现在Unity内部,如NetworkTranspo ...
- Swift 3 新特性
原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 S ...
- 【NLP】word2vec
http://blog.csdn.net/mytestmy/article/details/26969149?utm_source=tuicool&utm_medium=referral
- [AX2012 R3]关于Alerts
AX2012提供两种类型的Alert,Change-based alert和Due-date-based alert,前者用于在对新建记录.删除记录.记录的某个指定字段被改变的时候发出提醒,后者则是用 ...
- Gson整合Volley返回对象--GsonRequest
Gson是一个使用映射支持JSON与Java对象之间相互转换的库文件.你可以定义和JSON keys相对应名称的Java对象.把对象传递给传递Gson,然后Gson会帮你为对象填充字段值. 下面是一个 ...
- volley中图片加载
volley图片加载有三种方式: 记得:Volley中已经实现了磁盘缓存了,查看源码得知通过 context.getCacheDir()获取到了 /data/data/<application ...
- linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
- 储物柜soket通信协议和中间件实现技术细节
一.中间件程序的职责: 1)对柜机提供soket长连接的服务器端,就是soket server.可提供上万的客户端同时连接.用来实时响应控制请求,中间件必须随时知道某个柜机的在线状态,外部请求时才能判 ...
- 理解 JS 回调函数中的 this
任何变量或对象都有其赖以生存的上下文.如果简单地将对象理解为一段代码,那么对象处在不同的上下文,这段代码也会执行出不同的结果. 例如,我们定义一个函数 getUrl 和一个对象 pseudoWindo ...