zoukankan      html  css  js  c++  java
  • C# 迭代器 详解

    这里仅针对非泛型迭代器加以说明,泛型迭代器类似。

    代码一:

    public class Cars
        {
            
    private int[] intArr = { 1234567 };

            
    /// <summary>
            
    /// 命名迭代器
            
    /// </summary>
            
    /// <param name="isReverse">是否倒序迭代</param>
            
    /// <returns></returns>
            public IEnumerable SortEnum(bool isReverse)
            {
                
    if (!isReverse)
                {
                    
    for (int i = 0; i < intArr.Length; i++)
                    {
                        
    yield return intArr[i];
                    }
                }
                
    else
                {
                    
    for (int i = intArr.Length - 1; i >= 0; i--)
                    {
                        
    yield return intArr[i];
                    }
                }
            }
    //fun
        }//clas

    然后就可以对该类进行迭代操作了,代码如下: 

    Cars c = new Cars();
                    foreach (var item in c.SortEnum(true))
                    {
                        Console.WriteLine(item);
                    }

    其实编译时编译器为该类生成了一个内部类,该内部类就实现了IEnumerable和IEnumerator这两个接口。

    代码二:

    返回IEnumerator的方法
     public class Cars
        {
            
    public IEnumerator GetEnumerator()
            {
                
    yield return "1";
                
    yield return "2";
                
    yield return "3";
            }
    //fun
        }//clas

     示例代码如下:

    //注意这里c2不用调用方法了 
    Cars c2 = new Cars();
                    foreach (var item in c2)
                    {
                        Console.WriteLine(item);
                    }

    编译器也为该类生成了一个内部类,该内部类实现了IEnumerator接口。 

         由此可见,使用yield语法,一个类型要想可以使用foreach遍历其子元素,只要满足下面两个条件之一即可:

    1)有一个返回 IEnumerable 的方法,该方法内部是yield语句。

    2)有一个public IEnumerator GetEnumerator() 签名的方法,内部使用yield语句。

    上述代码之所以能那么写,是因为编译器帮我们实现了我们没有手动实现的条件。 

  • 相关阅读:
    如何自己手写一个热加载(转)
    阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?
    Java NIO浅析 转至 美团技术团队
    mysql在线修改表结构大数据表的风险与解决办法归纳(转)
    MySQL性能优化
    Tomcat Connector(BIO, NIO, APR)三种运行模式(转)
    redis 单线程的理解
    Spring 中的bean 是线程安全的吗?
    Spring 自定义注解,结合AOP,配置简单日志注解 (转)
    redis 分布式锁
  • 原文地址:https://www.cnblogs.com/imap/p/1896512.html
Copyright © 2011-2022 走看看