随心所欲~我也做个集合遍历器吧(自己的foreach,委托的威力)
感觉微软在面向对象三大原则中,封装性运用的最为突出,它会将一些复杂的算法,结构,功能代码进行封装,让程序员在使用时十分得心应手,如关键字里的foreach和labmda表达式里的Foreach等等,今天我也来写一个集合遍历器得了,呵呵。
小知识:你的集合如果是List,那么它里面的N多方法都是可以拿来就用的,今天的遍历功能,使用List里的GetEnumerator()方法实现,它返回的其实是一个Enumerator结果体,这个枚举器的结构体如下:
[Serializable]
public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
{ // 摘要:
// 获取枚举数当前位置的元素。
//
// 返回结果:
// System.Collections.Generic.List<T> 中位于该枚举数当前位置的元素。
public T Current { get; } // 摘要:
// 释放由 System.Collections.Generic.List<T>.Enumerator 使用的所有资源。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public void Dispose();
//
// 摘要:
// 使枚举数前进到 System.Collections.Generic.List<T> 的下一个元素。
//
// 返回结果:
// 如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
public bool MoveNext();
}
它有一个属性Current和一个方法MoveNext,这是我们实现遍历器的前提,Current属性会把当前值输出,而MoveNext会将集合指向下一个元素,它的返回值为bool类型,true表示有下一个元素,false表示集合已经被遍历完了。
有了上面的知识,我们再配合委托Action<T>,就可以设计一个自己的foreach方法了,呵呵
/// <summary>
/// 占占枚举遍历器
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="action"></param>
static void ForeachZzl<T>(IList<T> list, Action<T> action)
{
var e = list.GetEnumerator(); while (e.MoveNext())
{
action(e.Current);
}
}
调用这个方法也很简单,由于使用了委托,所以,只要保正你有一个输入参数T,就可以运用到所有方法体上了
List<string> enums = new List<string> { "", "", "", "", "" };
ForeachZzl(enums, i =>
{
Console.WriteLine(i);
});
怎么样,是不是有点向微软自己的Foreach这个lambda呀,呵呵,其实我们加个扩展方法,它就变成了lambda了,看代码
/// <summary>
/// 扩展方法要写在静态类里,方法也为静态方法(非静态方法不能写在静态类里,呵呵)
/// </summary>
public static class ExtensionFunction
{
public static void ForeachZzl<T>(this IList<T> list, Action<T> action)
{
var e = list.GetEnumerator(); while (e.MoveNext())
{
action(e.Current);
}
}
}
下面这种形式的调用是不是就很熟悉了,呵呵
enums.ForeachZzl(i =>
{
Console.WriteLine(i);
});
通过这篇文章,我们可以完全领略到委托的威力,呵呵。
随心所欲~我也做个集合遍历器吧(自己的foreach,委托的威力)的更多相关文章
- .NET 中创建支持集合初始化器的类型
对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰.至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些. 本文将编写一个类型,可以使用集合初始化器构造这个类型.不只是添 ...
- 疑问:Iterator 遍历器和数据集合各种遍历方法的区别
https://es6.ruanyifeng.com/#docs/iterator Iterator(遍历器)的概念 Iterator 接口主要供for...of消费 Iterator 的遍历过程是: ...
- 两种QMultiMap的遍历方法(最好使用只读遍历器)
留个爪,备查 QMultiMap<QString, QString>& remote_map = my_obj->m_MapVersion; // ccc 这里体现了引用的好 ...
- 【前端】【javascript】es6中的遍历器接口Iterator
好久没发文章啦-.-为了证明我还活着,我决定从笔记里面抓一篇还算不乱比较像文章的发出来... 这些笔记是我在学es6的时候断断续续记录的,最近会一份一份整理陆陆续续发出来,顺便也自己再看一遍.我学习e ...
- IOS各种集合遍历效率对比
前言: 对于ios项目开发中总会遇见各种集合遍历,出于对各种遍历效率的好奇心,所以准备写个测试程序测试一下 首先:先声明一个NSMutableArray,测试数据量分别是1000条,10000条,10 ...
- iOS学习16之OC集合遍历和数组排序
1.集合遍历 1> 遍历 集合(Collection):OC中提供的容器类:数组,字典,集合. 遍历:对集合中元素依次取出的过称叫做遍历. 三种方式:① for循环遍历: ② NSEnumera ...
- OC中几种集合的遍历方法(数组遍历,字典遍历,集合遍历)
// 先分别初始化数组.字典和集合,然后分别用for循环.NSEnumerator枚举器和forin循环这三个方法来实现遍历 NSArray *array = @[@"yinhao" ...
- iOS学习之Object-C语言集合遍历和数组排序
一.集合遍历 1.集合:OC中提供的容器类,数组,字典,集合. 2.遍历:对集合中元素依次取出的过程叫做遍历. 二.for循环遍历 1.通过for循环的循环变量用作数组元 ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
随机推荐
- python 自学笔记(四) 列表
有几天没有更新博客了,毕竟是自学,最近事情确实比较多,有时候想学的时候反而没时间,到有时间的时候反而不想学.以后得想办法改掉这个缺点,只要有时间就要学习自己想学的东西,希望自学的同学能和我共同交流,其 ...
- 算法分析-动态规划(cut_rod)
什么是动态规划,我们要如何描述它? 动态规划算法通常基于一个递推公式及一个或多个初始状态. 当前子问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法.暴力法等 ...
- Unix/Linux环境C编程入门教程(18) kali-linuxCCPP开发环境搭建
1. Kali linux是BT5的晋级版本,用于信息安全.基于Debian7内核.新建虚拟机. 2. 选择默认虚拟机 3. 选择稍后安装操作系统 4.选择Linux Debian7 64位,因为Ka ...
- Windows Azure 社区新闻综述(#69 版)
欢迎查看最新版本的每周综述,其中包含有关云计算和 WindowsAzure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 · 使用 Azur ...
- android 开发代码被黑客破译有那么容易吗?
很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...
- 关于关注和取消关注的nodejs写法
本例子的关注和取消关注,是通过ajax的方法实现的:nodejs后台写好api接口:响应前台的ajax 先看ajax的代码实现: // 用户关注标签 function subscribe(uid, t ...
- LightOJ - 1422 Halloween Costumes (区间dp)
Description Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he i ...
- iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...
- json具体解释
<span style="font-size:12px;">function testJson() { var jsonData = { "firstName ...
- 前端入门HTML5扩展知识(一)
一. 请描述一个网页从开始请求到最终显示的完整过程? 1. 在浏览器中输入网址: 2. 发送至 DNS 服务器并获得域名对应的 WEB 服务器的 IP 地址: 3. 与 WEB 服务器建立 TC ...