当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#2.0新特性探究之模拟泛型和内置算法

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

ASP.NET 中的 C#2.0新特性探究之模拟泛型和内置算法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 96 ::
收藏到网摘: n/a

在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接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。