c#2.0 IEnumberable接口
比如,我们可以写出如下的代码:
List<Book> thelib = Library.getbooks();
List<Book> found = thelib.FindAll(delegate(Book curbook) foreach (Book b in found) |
这段程序非常简单的展示给我们需要查找的信息,代码也非常的直接易懂。内置的数据结构给了我们强大的算法支持,不过,能不能够为自定义的类定义类似的算法呢?
比如,如果我有一个自定义的Library类并没有使用List<Book>存储数据,而是使用某种自定义的数据结构,我能不能也让用户使用类似的语法,忽略存储细节的使用匿名委托来实现特定的算法呢?
答案当然是肯定的,而且在C#中实现这样的功能是非常的简单。
首先让我们看看FindAll中用到的匿名委托的原型
public delegate bool Predicate<T>(T obj);
很明显的,上面的代码等于注册了一个搜索的回调,而在List内部定义了某种遍历的机制,从而实现了一个漂亮的算法结构Closure。
看到了这些,我们就可以定义自己的算法结构了,首先,我定义了一个如下的类
public class MyVec<T> { public static MyVec<T> operator +(MyVec<T> a, T b) { a._list.Add(b); return a; } public override string ToString() { StringBuilder builder = new StringBuilder(); foreach (T a in _list) { builder.Append(a.ToString()); builder.Append(","); } string ret = builder.Remove(builder.Length - 1, 1).ToString(); return ret; } public MyVec<T<>findAll(Predicate<T> act) // this is the inner object |
这个类中包含了一个的List<T>结构,主要是为了证实我们的想法是否可行,事实上,任何一个可以支持foreach遍历的结构都可以作为内置的数据存储对象,我们会在后面的例子中给出一个更加复杂的实现。
下面是用于测试这个实验类的代码:
static void Main(string[] args) { MyVec<int> a = new MyVec<int>(); a += 12; a += 15; a += 32; MyVec<int> b = a.findAll(delegate(int x) { if (x < 20) return true; return false; } ); Console.WriteLine("vection original"); |
编译,执行,程序输出:
vection original
12,15,32 vection found 32 |
和我们预期的完全相同。很明显的,List内部的算法与我们预期的基本相同。
Predicate<T>仅仅是为了仿照系统的实现而采用的一个委托,事实上可以使用自己定义的任何委托作为回调的函数体。
通过使用IEnumberable接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。
转载于:https://www.cnblogs.com/dhz123/archive/2004/10/29/2194401.html
c#2.0 IEnumberable接口相关推荐
- php 接口 2.0,YII 2.0 API接口开发
YII2.0 API接口开发 首先先安装 YII2.0 高级模板(安装请参考其他教程) 准备 添加数据库配置 common/config/main-local.php image 把backend目录 ...
- USB3.0超高速接口应用方案
概述 CH569/565 片上集成超高速USB3.0主机和设备控制器(内置 PHY).千兆以太网控制器.专用高速 SerDes 控制器(内置 PHY,可直接驱动光纤).高速并行接口HSPI.数字视频接 ...
- C# 8.0 默认接口实现
C# 8.0 默认接口实现 Intro C# 8.0 开始引入了默认接口实现,也就是可以在接口里写方法实现. 在之前的版本中接口上是没有办法定义实现的,方法也都是 public 的,除了接口和属性之外 ...
- IQueryable接口与IEnumberable接口的区别
简单解释一下:从网上看到IQueryable接口与IEnumberable接口的区别,都是简单的说了一下下面第一点的原因,没有实际的代码,我就简单的在叙述一下其区别的详细的过程. 1:这是从网上找的区 ...
- 方寸微电子T630 USB3.0超高速接口芯片 可替换赛普拉斯USB接口芯片 CYUSB3014 (应用:工业相机,视频会议, 3D打印, 高清B超,USB3.0视频采集卡, 高拍器、仪器仪表设备等)
T630接口芯片简介 T630 作为专用接口芯片,配合 FPGA,在大部分应用中,可替代赛普拉斯CYUSB301X系列芯片(工业相机和扫描仪领域已有多家头部客户使用) T630 是由方寸微电子自主研发 ...
- taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享
一.taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享 搜索当前会话用户作为卖家已卖出的 ...
- taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,淘宝R2接口,淘宝oAuth2.0交易接口代码分享
一.taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享 搜索当前会话用户作为卖家已卖出的 ...
- 微信3.1.0.41逆向-微信3.1.0.41HOOK接口(WeChatHelper3.1.0.41.dll)使用说明
为了节省微信HOOK开发时间,现将微信HOOK注入DLL接口给大家,本接口从3.0.0.47版本开始,最新版本3.1.0.41,后续会根据自己的时间升级,本接口用vc++2017编写,Win32编译, ...
- EasyCVR新版本v2.6.0调用接口获取视频流的方法变更
EasyCVR视频融合云服务平台可支持多类型设备.多协议方式接入.基于云边端一体化架构,平台可提供视频资源的汇聚融合与管理.监控直播与录像.存储与分发.服务器集群.智能分析.数据共享.集成与调用等能力 ...
- 方寸微 T630 USB3.0超高速接口芯片
T630接口芯片简介 T630 是由方寸微电子自主研发的 USB3.0 超高速接口芯片,具有功能丰富. 性能强劲.扩展性强等特点, USB3.0 接口支持主从模式,可根据用户需求进行角色配置,可广泛适 ...
最新文章
- PhpStorm升级后调用某些类提示phpstorm Unhandled exceptions
- HTML5 定位 geolocation
- 数据蒋堂 | 从一道招聘考题谈起
- ajax 公共请求头部,ajax请求中全局增加请求头,如常见的token
- Java基础 —— 异常
- 版本控制:集中式(SVN) vs 分布式(GIT)
- MySQL忽略主键冲突,避免重复插入数据的三种方式
- python 时间差计算
- 集群和分布式部署有什么区别?
- 报告:2020年NFT总市值达5200万美元
- 2018 Multi-University Training Contest 2: 1007. Naive Operations
- Atitit 数据库技术体系 艾提拉总结 目录 1. 2. 初始概念	5	2 1.1. 2.1. 数据库的类型,网状,层次,树形数据库,kv数据库。Oodb 多媒体数据库	5	2 1.2. 2.2.
- 网络棋牌游戏创造快乐心情
- 杨辉三角php程序,PHP写杨辉三角实例代码
- 【Google Play】Google Play 签名维护 ( 签名机制 | Google Play 签名机制选择 | 签名更新 )
- UML培训取得姣好成绩,受到客户好评
- 试用蓝牙模块的一点经验整理(Part 3, 关于iBeacon功能 )
- Ol3中Map事件全解析
- JVM-调优《常见可视化工具与命令行的使用》
- c语言表达式 amp amp,amp;amp;在C语言中是什么意思
热门文章
- PHP结合redis实现秒杀活动大并发
- 杨辉三角程序(一步步优化)
- Flutter之Flutter-Redux框架源码解析
- mysql清除内存不足_MySQL内存不足怎么办
- Windows下编译FFmpeg
- windows系统c语言编译环境,在Windows平台搭建C语言开发环境
- 中国高性能计算服务器排名,2007中国高性能计算100强出炉
- 查看已安装java插件_记录下eclipse下的插件安装,查看及删除方式
- python编码在哪里看_python怎么换编码
- java filter重定向_Java Filter(过滤器)——重定向