C#中IEnumerator<T>和IEnumerable的區(qū)別
在 C# 中,IEnumerator<T>
和 IEnumerable
是用于實現(xiàn)迭代的接口。它們的區(qū)別在于它們的功能和使用方式。
IEnumerable
接口表示一個可枚舉的集合,它定義了一個方法 GetEnumerator()
,該方法返回一個實現(xiàn)了 IEnumerator
接口的對象。這意味著類型實現(xiàn)了 IEnumerable
接口,它可以提供一個迭代器,用于按順序訪問集合中的元素。IEnumerable
接口是只讀的,它只能支持前向迭代,不能修改集合中的元素。
IEnumerator<T>
接口是泛型版本的迭代器接口,它繼承自 IEnumerator
接口,并增加了一個 Current
屬性,用于獲取集合中當(dāng)前位置的元素。IEnumerator<T>
接口定義了以下方法和屬性:
bool MoveNext()
:將迭代器移動到集合的下一個元素,如果成功移動到下一個元素則返回true
,否則返回false
。void Reset()
:將迭代器重置到集合的起始位置。T Current
:獲取集合中當(dāng)前位置的元素。
通過實現(xiàn) IEnumerator<T>
接口,可以創(chuàng)建一個能夠迭代訪問泛型集合中元素的迭代器。
下面是一個示例,演示了 IEnumerable
和 IEnumerator<T>
的用法和區(qū)別:
using System; using System.Collections; using System.Collections.Generic; public class MyCollection<T> : IEnumerable<T> { private List<T> items = new List<T>(); public void Add(T item) { items.Add(item); } public IEnumerator<T> GetEnumerator() { return new MyEnumerator<T>(items); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } public class MyEnumerator<T> : IEnumerator<T> { private List<T> items; private int currentIndex = -1; public MyEnumerator(List<T> items) { this.items = items; } public bool MoveNext() { currentIndex++; return currentIndex < items.Count; } public void Reset() { currentIndex = -1; } public T Current { get { return items[currentIndex]; } } object IEnumerator.Current { get { return Current; } } public void Dispose() { // 不需要實現(xiàn) } } public class Program { public static void Main() { MyCollection<int> collection = new MyCollection<int>(); collection.Add(1); collection.Add(2); collection.Add(3); // 使用 foreach 遍歷集合 Console.WriteLine("使用 foreach 遍歷集合:"); foreach (int item in collection) { Console.WriteLine(item); } Console.WriteLine(); // 使用迭代器手動遍歷集合 Console.WriteLine("使用迭代器手動遍歷集合:"); IEnumerator<int> enumerator = collection.GetEnumerator(); while (enumerator.MoveNext()) { int item = enumerator.Current; Console.WriteLine(item); } } }
在這個示例中,我們定義了一個名為 MyCollection<T>
的泛型集合類,它實現(xiàn)了 IEnumerable<T>
接口。在 MyCollection<T>
類中,我們使用 List<T>
存儲集合中的元素,并實現(xiàn)了 GetEnumerator
方法,返回一個實現(xiàn)了 IEnumerator<T>
接口的迭代器。
我們還定義了一個名為 MyEnumerator<T>
的泛型迭代器類,它實現(xiàn)了 IEnumerator<T>
接口。在 MyEnumerator<T>
類中,我們使用一個索引 currentIndex
跟蹤當(dāng)前位置,并實現(xiàn)了 MoveNext
方法、Reset
方法和 Current
屬性。
在 Main
方法中,我們創(chuàng)建了一個 MyCollection<int>
類型的集合實例,并向其中添加了幾個元素。然后,我們使用 foreach
循環(huán)和迭代器手動遍歷集合,并輸出每個元素的值。
通過實現(xiàn) IEnumerable<T>
和 IEnumerator<T>
接口,我們可以在 C# 中實現(xiàn)可迭代的集合,并使用foreach
循環(huán)或手動迭代器來訪問集合中的元素。 IEnumerator<T>
提供了更強(qiáng)大的功能,因為它允許直接訪問當(dāng)前元素,而不需要類型轉(zhuǎn)換。
到此這篇關(guān)于C#中IEnumerator<T>和IEnumerable的區(qū)別的文章就介紹到這了,更多相關(guān)C# IEnumerator<T> IEnumerable內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例

c#使用Dataset讀取XML文件動態(tài)生成菜單的方法