在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的编程任务变得非常的简单,而且写出来的程序非常的优美。

  比如,我们可以写出如下的代码:

List<Book> thelib = Library.getbooks();

List<Book> found = thelib.FindAll(delegate(Book curbook)
{
 if (curbook.isbn.StartsWith("..."))
  return true;
  return false;
});

foreach (Book b in found)
Console.WriteLine(b.isbn);

  这段程序非常简单的展示给我们需要查找的信息,代码也非常的直接易懂。内置的数据结构给了我们强大的算法支持,不过,能不能够为自定义的类定义类似的算法呢?

  比如,如果我有一个自定义的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)
 {
  MyVec<T:>t2 = new MyVec<T>();
  foreach(T i in _list)
  {
   if (act(i))
   t2._list.Add(i);
  }
  return t2;
 }

 // this is the inner object
 private List<T> _list = new List<T>();
}

  这个类中包含了一个的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");
 Console.WriteLine(a.ToString());
 Console.WriteLine("vection found");
 Console.WriteLine(b.ToString());
 Console.ReadLine();
}

  编译,执行,程序输出:

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接口相关推荐

  1. php 接口 2.0,YII 2.0 API接口开发

    YII2.0 API接口开发 首先先安装 YII2.0 高级模板(安装请参考其他教程) 准备 添加数据库配置 common/config/main-local.php image 把backend目录 ...

  2. USB3.0超高速接口应用方案

    概述 CH569/565 片上集成超高速USB3.0主机和设备控制器(内置 PHY).千兆以太网控制器.专用高速 SerDes 控制器(内置 PHY,可直接驱动光纤).高速并行接口HSPI.数字视频接 ...

  3. C# 8.0 默认接口实现

    C# 8.0 默认接口实现 Intro C# 8.0 开始引入了默认接口实现,也就是可以在接口里写方法实现. 在之前的版本中接口上是没有办法定义实现的,方法也都是 public 的,除了接口和属性之外 ...

  4. IQueryable接口与IEnumberable接口的区别

    简单解释一下:从网上看到IQueryable接口与IEnumberable接口的区别,都是简单的说了一下下面第一点的原因,没有实际的代码,我就简单的在叙述一下其区别的详细的过程. 1:这是从网上找的区 ...

  5. 方寸微电子T630 USB3.0超高速接口芯片 可替换赛普拉斯USB接口芯片 CYUSB3014 (应用:工业相机,视频会议, 3D打印, 高清B超,USB3.0视频采集卡, 高拍器、仪器仪表设备等)

    T630接口芯片简介 T630 作为专用接口芯片,配合 FPGA,在大部分应用中,可替代赛普拉斯CYUSB301X系列芯片(工业相机和扫描仪领域已有多家头部客户使用) T630 是由方寸微电子自主研发 ...

  6. taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享

    一.taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享 搜索当前会话用户作为卖家已卖出的 ...

  7. taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,淘宝R2接口,淘宝oAuth2.0交易接口代码分享

    一.taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,R2接口,oAuth2.0交易接口代码分享 搜索当前会话用户作为卖家已卖出的 ...

  8. 微信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编译, ...

  9. EasyCVR新版本v2.6.0调用接口获取视频流的方法变更

    EasyCVR视频融合云服务平台可支持多类型设备.多协议方式接入.基于云边端一体化架构,平台可提供视频资源的汇聚融合与管理.监控直播与录像.存储与分发.服务器集群.智能分析.数据共享.集成与调用等能力 ...

  10. 方寸微 T630 USB3.0超高速接口芯片

    T630接口芯片简介 T630 是由方寸微电子自主研发的 USB3.0 超高速接口芯片,具有功能丰富. 性能强劲.扩展性强等特点, USB3.0 接口支持主从模式,可根据用户需求进行角色配置,可广泛适 ...

最新文章

  1. PhpStorm升级后调用某些类提示phpstorm Unhandled exceptions
  2. HTML5 定位 geolocation
  3. 数据蒋堂 | 从一道招聘考题谈起
  4. ajax 公共请求头部,ajax请求中全局增加请求头,如常见的token
  5. Java基础 —— 异常
  6. 版本控制:集中式(SVN) vs 分布式(GIT)
  7. MySQL忽略主键冲突,避免重复插入数据的三种方式
  8. python 时间差计算
  9. 集群和分布式部署有什么区别?
  10. 报告:2020年NFT总市值达5200万美元
  11. 2018 Multi-University Training Contest 2: 1007. Naive Operations
  12. Atitit 数据库技术体系 艾提拉总结 目录 1. 2. 初始概念 5 2 1.1. 2.1. 数据库的类型,网状,层次,树形数据库,kv数据库。Oodb 多媒体数据库 5 2 1.2. 2.2.
  13. 网络棋牌游戏创造快乐心情
  14. 杨辉三角php程序,PHP写杨辉三角实例代码
  15. 【Google Play】Google Play 签名维护 ( 签名机制 | Google Play 签名机制选择 | 签名更新 )
  16. UML培训取得姣好成绩,受到客户好评
  17. 试用蓝牙模块的一点经验整理(Part 3, 关于iBeacon功能 )
  18. Ol3中Map事件全解析
  19. JVM-调优《常见可视化工具与命令行的使用》
  20. c语言表达式 amp amp,amp;amp;在C语言中是什么意思

热门文章

  1. PHP结合redis实现秒杀活动大并发
  2. 杨辉三角程序(一步步优化)
  3. Flutter之Flutter-Redux框架源码解析
  4. mysql清除内存不足_MySQL内存不足怎么办
  5. Windows下编译FFmpeg
  6. windows系统c语言编译环境,在Windows平台搭建C语言开发环境
  7. 中国高性能计算服务器排名,2007中国高性能计算100强出炉
  8. 查看已安装java插件_记录下eclipse下的插件安装,查看及删除方式
  9. python编码在哪里看_python怎么换编码
  10. java filter重定向_Java Filter(过滤器)——重定向