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 屬性,用于獲取集合中當前位置的元素。IEnumerator<T> 接口定義了以下方法和屬性:
bool MoveNext():將迭代器移動到集合的下一個元素,如果成功移動到下一個元素則返回true,否則返回false。void Reset():將迭代器重置到集合的起始位置。T Current:獲取集合中當前位置的元素。
通過實現(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 跟蹤當前位置,并實現(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> 提供了更強大的功能,因為它允許直接訪問當前元素,而不需要類型轉換。
到此這篇關于C#中IEnumerator<T>和IEnumerable的區(qū)別的文章就介紹到這了,更多相關C# IEnumerator<T> IEnumerable內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關應用案例詳解
最近在學習演化一款游戲項目框架時候,框架作者巧妙使用接口中方法的顯式實現(xiàn)來變相對接口中方法進行“密封”,增加實現(xiàn)接口的類訪問方法的“成本”,這篇文章主要介紹了C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關應用案例,需要的朋友可以參考下2024-05-05

