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

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 40 ::
收藏到网摘: 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接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。