C#迭代器


1.迭代器方法

  可以使用foreach循環語句進行的迭代的方法,稱為可迭代方法,或者迭代器方法。

迭代器用法法介紹。

  迭代器用於依次返回每個元素,一般用於foreach循環語句。迭代器方法需要使用yield return語句。

 yield return 語句介紹

  保持代碼的當前位置,在下一次調用迭代器方法時執行。

 

 

 迭代方法在使用過程中左右步驟對應。yield return語句主要是返回一個結果作為函數調用的結果。並記錄當前運行位置,當下次函數被調用時,在當前位置執行這個函數。在迭代塊中除了yield return外,不允許出現普通的return語句。

迭代方法使用的命名空間為using System.Collections.Generic;

下面代碼為迭代器使用的具體代碼

    class Program
    {
        public static IEnumerable<int> Fibs()
        {
            int f1 = 1, f2 = 2;
            while (true)
            {
                yield return f1;
                yield return f2;
                f1 += f2;
                f2 += f1;
            }
        }
        static void Main(string[] args)
        {
            foreach (int i in Fibs())
                if (i < 20)
                    Console.WriteLine("{0}", i);

                else
                    break;
            Console.ReadKey();
        }  
    }

 IEnumerable<int>是泛型定義的里面的int關系到你迭代對象yield return返回值的類型。如果你定義IEnumerable<int>那么你返回的值是int類型,如果你定義IEnumerable<string>那么你的返回值是string類型以此類推。如果你想以某個條件結束方法。可以使用外面的條件如上圖所示。也可以使用yield break。

    class Program
    {
        public static IEnumerable Fibs()
        {
            string f1 = "1", f2 = "2";
            while (true)
            {
                yield return f1;
                yield return f2;
                f1 += f2;
                f2 += f1;
                if (f1.Length > 8)
                    yield break;
            }
        }

        static void Main(string[] args)
        {
            foreach (string i in Fibs())
                
                    Console.WriteLine("{0}", i);
            Console.ReadKey();
        }  
    }

 2.手動實現迭代器方法

首先是通過使用接口IEnumerable的方式,然后編寫IEnumerator GetEnumerator()的方式。在代碼中控制索引位置,和循環次數。如果索引位置出錯則使用代碼throw new NotImplementedException()報錯。

using System;
using System.Collections;
using System.Collections.Generic;


namespace test02
{
    class Program
    {
        static void Main(string[] args)
        {
            object [] e = new object[5] { 1, 2, 3, 4, 5 };
            Itear01 s = new Itear01(e,2);
            foreach (object i in s)
                    Console.WriteLine("{0}", i);
            Console.ReadKey();
        }  
    }

    public class Itear01 : IEnumerable
    {
        object[] values;
        int StartPoint=-1;
        int current=0;
        public Itear01(object[] values,int StartPoint)
        {
            this.values = values;
            this.StartPoint = StartPoint;
        }
        public IEnumerator GetEnumerator()
        {
            if(this.StartPoint==-1)
                throw new NotImplementedException();
            while(true)
            {
                yield return this.values[StartPoint];
                StartPoint = (StartPoint + 1) % values.Length;
                current++;
                if (current == values.Length)
                {
                    break;
                }
            }
            
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM