Ienumerable 和IEnumerator接口的差异是什么,请分别举例说明
时间: 2024-02-27 15:59:23 浏览: 111
`IEnumerable` 接口和 `IEnumerator` 接口的主要差异是它们所提供的功能不同。
`IEnumerable` 接口是一个集合接口,它定义了一个方法 `GetEnumerator()`,返回一个实现了 `IEnumerator` 接口的对象,用于遍历集合中的元素。
例如,下面是一个实现了 `IEnumerable` 接口的自定义集合类 `MyCollection`:
```csharp
public class MyCollection<T> : IEnumerable<T>
{
private T[] _items;
public MyCollection(T[] items)
{
_items = items;
}
public IEnumerator<T> GetEnumerator()
{
return new MyEnumerator<T>(_items);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
```
在上面的代码中,`MyCollection` 类实现了 `IEnumerable<T>` 接口,并提供了 `GetEnumerator()` 方法来返回一个实现了 `IEnumerator<T>` 接口的对象。
而 `IEnumerator` 接口则是一个枚举器接口,它定义了三个方法 `MoveNext()`、`Reset()` 和 `Current`。它允许我们在集合中遍历元素。
例如,下面是一个实现了 `IEnumerator` 接口的自定义枚举器类 `MyEnumerator`:
```csharp
public class MyEnumerator<T> : IEnumerator<T>
{
private T[] _items;
private int _currentIndex = -1;
public MyEnumerator(T[] items)
{
_items = items;
}
public T Current
{
get { return _items[_currentIndex]; }
}
object IEnumerator.Current
{
get { return Current; }
}
public bool MoveNext()
{
_currentIndex++;
return _currentIndex < _items.Length;
}
public void Reset()
{
_currentIndex = -1;
}
public void Dispose()
{
// Dispose unmanaged resources here
}
}
```
在上面的代码中,`MyEnumerator` 类实现了 `IEnumerator<T>` 接口,并提供了 `MoveNext()`、`Reset()` 和 `Current` 方法,它们用于遍历集合中的元素。
因此,我们可以通过 `MyCollection` 类的 `GetEnumerator()` 方法获取到一个 `MyEnumerator` 类的实例,然后通过调用 `MoveNext()` 方法遍历集合中的元素,通过调用 `Current` 属性获取当前元素的值,直到遍历结束。
阅读全文