c#2.0 IEnumberable接口

转载 2004年10月29日 13:30:00
在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接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。

接口IEnumberable,IEnumberable

1.IEnumberable和IEnumberableIEnumerable和IEnumerable接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简...
  • Chenzaixia
  • Chenzaixia
  • 2010年10月21日 16:26
  • 2141

C# IEnumberable 的用法

C# IEnumberable 的用法using System; using System.Collections.Generic; using System.Linq; using Syste...
  • u010969626
  • u010969626
  • 2016年04月22日 11:30
  • 299

C#2.0初涉及

看了一下午的C#2.0,感觉C#及其简单,也许是我没有怎么深入吧不管怎么说,对于C#有一点点概念了在VS.net2005下,一切的一切都被集成化了,在于.net框架使用了CLR(common lang...
  • sticklee
  • sticklee
  • 2008年01月05日 12:47
  • 394

IQueryable接口与IEnumberable区别

IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再...
  • tyfbhlxd
  • tyfbhlxd
  • 2017年05月11日 18:43
  • 135

迭代器,IEnumerator和IEnumerable的关系

先声明本文只是代表我个人的想法,对不对望大家指点。 迭代器,IEnumerator和IEnumerable的目的就是实现我们自定义类可以实现类似list等CollectionBase类的foreach...
  • u013368262
  • u013368262
  • 2014年03月27日 11:03
  • 542

C#2.0 有哪些新特性?

泛型 在我看来,泛型就是通过将数据类型参数化从而实现了代码的更为灵活的复用,泛型的出现使得C#能够使用同一段代码来操作多种数据类型。泛型无疑是C#2.0最重大的改进,它的出现赋予了C#代码更强的类型...
  • niuniuasb
  • niuniuasb
  • 2017年02月07日 11:33
  • 361

ASP EF框架,IQueryable接口和IEnumberable接口的区别

IQueryable接口是继承自IEnumberable接口的。 IQueryable接口类型,有延迟加载机制,只有在使用到数据时才去查询数据库。 IEnumberable接口类型,没有延迟加...
  • houyanhua1
  • houyanhua1
  • 2018年01月07日 20:41
  • 233

【第一章】C#的进化史——C#1.0,2.0,3.0区别比较(一)

一个产品(Product)类,通过该类的声明来观察C#的进化 C# 1.0版 public class Product { string name; pu...
  • qjzh
  • qjzh
  • 2012年02月11日 19:25
  • 1874

IQueryable & IEnumberable 区别

IQueryable & IEnumberable 区别 标签: c# 2012-12-06 19:51 3335人阅读 评论(0) 收藏 举报  分类: Asp.ne...
  • dongliang_shali
  • dongliang_shali
  • 2016年02月16日 17:49
  • 190

.NET 框架中的格式和集合

Dr. GUI 的位和字节使用不同语言时的危险Dr.GUI 最近有机会帮助一位朋友解决了他在初级 C 语言课程中所遇到的编程问题。请不要介意,距离这位好心的博士使用 C 语言来编程,几乎已经隔了十年之...
  • acumengrass
  • acumengrass
  • 2006年01月13日 21:01
  • 2941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#2.0 IEnumberable接口
举报原因:
原因补充:

(最多只允许输入30个字)