添加Linq支持
来源:互联网 发布:男士冬天护肤 知乎 编辑:程序博客网 时间:2024/06/06 09:34
C#中添加Linq支持,只需添加一个迭代器就完成支持。迭代器模式是面向对象语言一个常见设计模式,C#中无需像C++那样维护一个内部状态,通过关键字yield模式来实现,编译器通过自动生成一个内部类来维护迭代器中的状态。测试程序如下:
public class EYield : IEnumerable<string> { public IEnumerator<string> GetEnumerator() { for (int i = 0; i < 10; i++) { yield return string.Format("i:{0},date:{1}",i,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } }; class Program { static void Main(string[] args) { EYield y = new EYield(); Console.WriteLine("first:{0}",y.First()); foreach (var item in y) { Console.WriteLine("item:{0}",item); } Console.ReadLine(); }}继承IEnumerable<T>基类就可以调用Linq方法,这样编写的程序就多了很多功能,通过反汇编可看出其内部实现的视图:
| M A N I F E S T |___[NSP] IEnumYield | |___[CLS] IEnumYield.EYield | | | .class public auto ansi beforefieldinit | | | implements class [mscorlib]System.Collections.Generic.IEnumerable`1<string> | | | implements [mscorlib]System.Collections.IEnumerable | | |___[CLS] <GetEnumerator>d__0 | | | | .class nested private auto ansi sealed beforefieldinit | | | | implements class [mscorlib]System.Collections.Generic.IEnumerator`1<string> | | | | implements [mscorlib]System.Collections.IEnumerator | | | | implements [mscorlib]System.IDisposable | | | | .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) ... | | | |___[FLD] <>1__state : private int32 | | | |___[FLD] <>2__current : private string | | | |___[FLD] <>4__this : public class IEnumYield.EYield | | | |___[FLD] <i>5__1 : public int32 | | | |___[MET] .ctor : void(int32) | | | |___[MET] MoveNext : bool() | | | | System.Collections.Generic.IEnumerator<System.String>.get_Current : string() | | | |___[MET] System.Collections.IEnumerator.Reset : void() | | | |___[MET] System.Collections.IEnumerator.get_Current : object() | | | |___[MET] System.IDisposable.Dispose : void() | | | |___[PTY] 'System.Collections.Generic.IEnumerator<System.String>.Current' : instance string() | | | |___[PTY] System.Collections.IEnumerator.Current : instance object() | | | | | |___[MET] .ctor : void() | | | GetEnumerator : class [mscorlib]System.Collections.Generic.IEnumerator`1<string>() | | |___[MET] System.Collections.IEnumerable.GetEnumerator : class [mscorlib]System.Collections.IEnumerator() | | | |___[CLS] IEnumYield.Program | | | .class private auto ansi beforefieldinit | | |___[MET] .ctor : void() | | |___[STM] Main : void(string[]) | | |编译器通过自动产生一个d__0的内部类,该类通过维护内部状态(__state,__current),通过调用MoveNext方法来实现逐步向下移动,通过get_current方法类获取一个元素。
While(MoveNext()){get_current();}
0 0
- 添加Linq支持
- Linq 之添加数据
- 让Lua支持Linq吧
- LINQ学习篇(2) -- 支持 LINQ 的 Visual Basic 功能
- Linq 目前只支持SQL Server数据库
- 使用MongoDB的支持Linq 驱动NoRM
- linq查询数据函数支持程度
- 让Linq的OrderBy支持动态字段
- DLL 添加MFC 支持
- RedHat9添加语言支持
- 添加ActiveSync支持
- ClistCtrl 添加 排序支持
- ppcboot添加nandflash支持
- Flex3添加拖放支持
- wince添加局域网支持
- 添加以下 支持modes
- PHP5添加MySQLi支持
- vs2008添加clearcase支持
- 【转载】使用注解和反射实现通用性…
- 宏和内联函数的根本区别
- SQLServer-----SQLServer 2008 R2备份、还原数据库
- 【IOS】iOS Developer Library (苹果开发者文档)官网路径
- C++--------------------------------------Map的基础用法
- 添加Linq支持
- 从 QA 到 EP (三)
- search函数和search_n()函数
- java中mongodb的查询及排序
- Android应用开发之快速开始
- socket编程中select的使用
- Android四大基本组件介绍与生命周期
- linx时间加减操作
- Android中drawableStart和drawableLeft的区别