添加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
原创粉丝点击