做網(wǎng)站時(shí) 404網(wǎng)頁如何指向作品推廣
????????在C#中,自定義遍歷器需要實(shí)現(xiàn)IEnumerable接口和IEnumerator接口。其中,IEnumerable接口包含一個(gè)GetEnumerator方法,該方法返回一個(gè)IEnumerator接口的實(shí)例,而IEnumerator接口包含Current、MoveNext和Reset方法。
IEnumerable:IEnumerable是一個(gè)接口,它代表一個(gè)可以迭代的集合。這意味著可以使用IEnumerator:foreach循環(huán)遍歷IEnumerable對(duì)象中的元素。
在C#中,
IEnumerator
是.NET框架中的一個(gè)接口,它用于在集合中遍歷元素。這個(gè)接口通常與使用foreach
循環(huán)來遍歷集合的代碼一起使用。
IEnumerator
接口定義了兩個(gè)主要的方法:MoveNext()
和Reset()
。
MoveNext()
方法用于將迭代器移動(dòng)到集合中的下一個(gè)元素。如果集合中沒有更多的元素,則該方法將返回false
。Reset()
方法用于重置迭代器,使其重新回到集合的起始位置。此外,
IEnumerator
接口還定義了一個(gè)Current
屬性,它返回當(dāng)前迭代器位置的元素。
一、yield關(guān)鍵字生成迭代器
using System;
using System.Collections.Generic; class Program
{ static void Main() { foreach (int number in GetNumbers()) { Console.WriteLine(number); } } static IEnumerable<int> GetNumbers() { for (int i = 0; i < 10; i++) { yield return i; } }
}
? ? ? ? ?只有IEnumerable才能通過foreach被遍歷。
二、關(guān)于IEnumerator的用法示例
List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" }; IEnumerator enumerator = fruits.GetEnumerator(); while (enumerator.MoveNext())
{ string fruit = (string)enumerator.Current; Console.WriteLine(fruit);
}
通過這個(gè)例子可以看出來?IEnumerable是一個(gè)可以迭代的集合,而IEnumerator是定義foreach迭代器。
三、自定義一可以遍歷的類
public class Program{static void Main(string[] args){student st = new student();st.add(2);st.add(3);st.add(100);foreach (var item in st){Console.WriteLine(item);}Console.Read();}}public class student : IEnumerable, IEnumerator{private List<int> _data;private int position = -1;private List<int> data = new List<int>();public student(){ }public student(List<int> data){this._data = data;}public object Current => _data[position];public void add(int num){data.Add(num);}public IEnumerator GetEnumerator(){return new student(data);}public bool MoveNext(){position++;return position < _data.Count;}public void Reset(){position = -1;}}
代碼2
using System;
using System.Collections;public class MyList : IEnumerable
{private int[] data = { 1, 2, 3, 4, 5 };public IEnumerator GetEnumerator(){return new MyEnumerator(data);}
}public class MyEnumerator : IEnumerator
{private int[] data;private int position = -1;public MyEnumerator(int[] data){this.data = data;}public object Current{get{return data[position];}}public bool MoveNext(){position++;return (position < data.Length);}public void Reset(){position = -1;}
}// 使用自定義遍歷器
class Program
{static void Main(string[] args){MyList list = new MyList();foreach (int i in list){Console.WriteLine(i);}}
}