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

ASP.NET
asp.net css注释的影响
ASP.NET与数据库相关技巧
关于HtmlForm控件
三色交替的下拉列表框
精通ASP.NET中弹出窗口技术
ASP.NET Forums与现有系统整合方案示例
ASP.NET操作IIS中的虚拟目录
DataGrid与SQL Server 2000数据绑定
如何让Web应用程序在Client端实现导出报表功能
如何保证web app中的Send Email线程稳定性
关于用ASP.Net识别远程主机服务器种类
ASP.NET中上传下载文件
提高ASP.NET性能的方法
asp.net StreamReader 创建文件
asp.net如何生成图片验证码(简单)
一个.net 压缩位图至JPEG的代码
简单的SQL Server数据库数据读取与数据操作
获取网站的RSS聚合到自己的网页
.Net程序中整站通用的防SQL注入函数
asp.net生成缩略图及给原始图加水印的函数

ASP.NET 中的 C#2.0 新特性探究(一) 模拟List和内置算法


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

C#中的范型对于很多从C++转过来的程序员来说,可以说是一个天大的喜讯。hehe,至少笔者对于这个新特性是充满了敬仰之情。在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的编程任务变得非常的简单,而且写出来的程序非常的优美。 比如,我们可以写出如下的代码: List thelib = Library.getbooks(); List 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存储数据,而是使用某种自定义的数据结构,我能不能也让用户使用类似的语法,忽略存储细节的使用匿名委托来实现特定的算法呢?答案当然是肯定的,而且在C#中实现这样的功能是非常的简单。 首先让我们看看FindAll中用到的匿名委托的原型public delegate bool Predicate(T obj); 很明显的,上面的代码等于注册了一个搜索的回调,而在List内部定义了某种遍历的机制,从而实现了一个漂亮的算法结构Closure。 看到了这些,我们就可以定义自己的算法结构了,首先,我定义了一个如下的类 public class MyVec { public static MyVec operator +(MyVec 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 findAll(Predicate act) { MyVec t2 = new MyVec(); foreach(T i in _list) { if (act(i)) t2._list.Add(i); } return t2; } // this is the inner object private List _list = new List();} 这个类中包含了一个的List结构,主要是为了证实我们的想法是否可行,事实上,任何一个可以支持foreach遍历的结构都可以作为内置的数据存储对象,我们会在后面的例子中给出一个更加复杂的实现。 下面是用于测试这个实验类的代码:static void Main(string[] args) { MyVec a = new MyVec(); a += 12; a += 15; a += 32; MyVec 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 original12,15,32vection found32 和我们预期的完全相同。很明显的,List内部的算法与我们预期的基本相同。Predicate仅仅是为了仿照系统的实现而采用的一个委托,事实上可以使用自己定义的任何委托作为回调的函数体。通过使用IEnumberable接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。