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语句。

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

  • 相关阅读:
    四天玩转 Windows Phone 开发教学视频
    DZNT REST API doc
    【译著】Code First :使用Entity. Framework编程(1)
    如何关闭ReSharper中的[ Use 'var' ]提示How to Disable C# “var” Recommendation in ReSharper
    查看域名txt记录
    VS文本编辑器vssettings下载站
    .net 开发windows服务
    .net 简单图表控件 (之总结篇 源代码及测试示例) [c/s桌面应用程序控件] IV
    c# 算节气
    js 自定义title提示框
  • 原文地址:https://www.cnblogs.com/imap/p/1896512.html
Copyright © 2011-2022 走看看