添加Linq支持

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值