C# 2.0的模拟泛型和内置算法

在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遍历的结构都可以作为内置的数据存储对象,我们会在后面的例子中给出一个更加复杂的实现。

时间: 2024-10-02 01:34:37

C# 2.0的模拟泛型和内置算法的相关文章

C# 2.0新特性探究之模拟泛型和内置算法

算法 在C#2.0中,匿名方法.IEnumerable接口和匿名方法的合作,使很多的编程任务变得非常的简单,而且写出来的程序非常的优美. 比如,我们可以写出如下的代码: List<Book> thelib = Library.getbooks(); List<Book> found = thelib.FindAll(delegate(Book curbook) { if (curbook.isbn.StartsWith("...")) return true;

Asp.Net4.0/VS2010新变化(6):内置的图表控件

.net4.0以前,要想在网页上画个饼图,那还真不是个轻松的活儿,得有点技术含量,比如:可以用System.Drawing下的那些东东,再或者用Silverlight/Flash或第三方控件   现在asp.net 4.0已经把它做成控件了   直接拖到页面就完事了,下面是示例代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inhe

FreeIPMI 1.0.8发布 内置和外部的IPMI软件

Freehttp://www.aliyun.com/zixun/aggregation/14260.html">IPMI是一个基于IPMI v1.5/2.0规范,提供了内置和外部的IPMI软件.它具有一个非常有用的大型HPC或集群环境功能. 有关IPMI 智能平台管理接口 (IPMI) 是一种开放标准的硬件管理接口规格,定义了嵌入式管理子系统进行通信的特定方法.IPMI 信息通过基板管理控制器 (BMC)(位于 IPMI 规格的硬件组件上)进行交流.使用低级硬件智能管理而不使用操作系统进行

FreeIPMI 1.1.5发布 内置和外部的IPMI软件

Freehttp://www.aliyun.com/zixun/aggregation/14260.html">IPMI 是一个基于IPMI v1.5/2.0规范,提供了内置和外部的IPMI软件.它具有一个非常有用的大型HPC或集群环境功能. 有关IPMI 智能平台管理接口 (IPMI) 是一种开放标准的硬件管理接口规格,定义了嵌入式管理子系统进行通信的特定方法.IPMI 信息通过基板管理控制器 (BMC)(位于 IPMI 规格的硬件组件上)进行交流.使用低级硬件智能管理而不使用操作系统进

FreeIPMI 1.1.2发布 内置和外部的IPMI软件

Freehttp://www.aliyun.com/zixun/aggregation/14260.html">IPMI是一个基于IPMI v1.5/2.0规范,提供了内置和外部的IPMI软件.它具有一个非常有用的大型HPC或集群环境功能. 有关IPMI 智能平台管理接口 (IPMI) 是一种开放标准的硬件管理接口规格,定义了嵌入式管理子系统进行通信的特定方法.IPMI 信息通过基板管理控制器 (BMC)(位于 IPMI 规格的硬件组件上)进行交流.使用低级硬件智能管理而不使用操作系统进行

Google Chrome浏览器已内置Adobe Flash Player

据可靠消息来源透露,谷歌计划在自己的Chrome浏览器中捆绑Adobe公司的Flash插件,以便两家公司的合作能够进一步深入.据称两家公司将于本周二发布Chrome捆绑Flash的正式声明,与之形成鲜明对比的是,坚决反对Flash的苹果公司则很快便会发布不支持Flash的iPad平板电脑.两者的对比呈现出一幅"冰火两重天"的奇异景象. 另据据CNet报道,Google正在计划在其Chrome 浏览器和(或)Chrome OS 操作系统中捆绑 Adobe 的 Flash 插件,这一消息可

如何拿到阿里技术offer:从《2.5年, 从0 -&gt;阿里》体味阿里内推招聘

前面的一段时间时间和大家分享了许多文章,一部分文章是关于校招,另外一部分是关于社招的面试经验,社招往往比校招的要求更加严格,相比之下也更难.其实在阿里,除了校招和社招这两种招聘方式之外还有第三种,就是内推.所谓内推,就是在公司或者企业里,有了解或者熟悉你的人,并且认为你有担任某些技术人员的能力,直接跨过招聘网站将你的简历交给面试官的一种工作的推荐方式(大概就是这样吧). BAT都是存在内推的,在知乎上有篇文章<阿里内推面试,应该注意什么?>(链接)有不少可以参考的意见,其中几点我觉得能让我们更

CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)

所有文章索引:CYQ.Data 轻量数据层之路 框架开源系列 索引   前言: 从V1.5发布到现在时隔20天了,终于发布2.0版本了,2.0系列版本由于引入多数据库支持,内部结构改动较大. 但是外面调用方式仍保持一致向下兼容,因此若从原来V1.N版本升级到2.N版本,只需要轻轻更换CYQ.Data.DLL即可,界面代码不需要改变.   疑问? 最近26号才刚发布了V1.5.5,怎么才3天又发布了2.0版本?就这么点时间改动就很大,那不是很不稳定? 解疑: V1.5.5版本是拿V1.5版本的源码

【新人求助!】如何编写输入一个数字找0到这个数字范围内的所有偶数

问题描述 大神们帮帮忙吧,小的是才进入大一没几天的人,之前毫无基础,现在在gedit编写java格式的文件然后在terminal里check,但是很多都没有思路啊,如列出的以下:1.输入一个数字找0到这个数字范围内的所有偶数2.输入一系列数字找其中的最小正整数3.输入一个大于0的数字,在terminal里回复得到*的符号然后依次递减排成几排e.g.:输入:5得到:***************4.输入一个单词,得到单词的相反顺序,判断单词是否是回文e.g.:输入:apple得到:elppap.s