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

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

  • 相关阅读:
    UICollectionView 应用
    关于UIWebView不能响应touchesBegan等四个方法的解决案例【可以检测 单击双击】
    IOS6 中新特性介绍
    KVO 使用
    IOS 学习资料汇总(^_^)
    [DEVDIV翻译] Core Animation中文翻译_第一章_什么是核心动画
    StoryBoard学习..(很详细.)
    Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
    sqlite语句主页
    Android的快速开发框架 afinal
  • 原文地址:https://www.cnblogs.com/imap/p/1896512.html
Copyright © 2020-2023  润新知