一文读懂C#中的IEnumerable和IEnumerator的区别

科技   2024-11-22 07:16   北京  

在 .NET 中,IEnumerable 和 IEnumerator 是与集合迭代相关的两个接口,但它们的职责和用途有所不同。简单来说,IEnumerable 是集合的抽象,用于使集合可以被枚举;而 IEnumerator 则负责具体的枚举操作,实现实际的迭代。

1. IEnumerable 接口

IEnumerable 是一个集合接口,用于表示一个可以被枚举的集合对象。

定义:IEnumerable 是一个包含 GetEnumerator() 方法的接口。GetEnumerator() 方法返回一个 IEnumerator 对象。

作用:允许集合对象支持 foreach 语法,使集合可以被遍历。

    典型用法:所有集合类(如数组、列表等)都实现了 IEnumerable 接口,以支持枚举操作。

IEnumerable 示例:


public class MyCollection : IEnumerable{ private string[] items = { "Item1", "Item2", "Item3" };
public IEnumerator GetEnumerator() { return items.GetEnumerator(); }}


在上面例子中,通过实现 IEnumerable,可以将 MyCollection 对象用于 foreach 循环中。

2. IEnumerator 接口

IEnumerator 是用于实际执行迭代的接口。

定义:IEnumerator 包含 MoveNext()、Current 属性和 Reset() 方法。

作用:管理遍历的当前位置。MoveNext() 方法用于移动到下一个元素,Current 属性返回当前元素。

典型用法:IEnumerator 是实际的迭代器,控制集合的遍历。

IEnumerator 示例:


public class MyCollectionEnumerator : IEnumerator{ private string[] items; private int position = -1;
public MyCollectionEnumerator(string[] items) { this.items = items; }
public bool MoveNext() { position++; return (position < items.Length); }
public void Reset() { position = -1; }
public object Current { get { return items[position]; } }}



IEnumerable 和 IEnumerator 的关系

    IEnumerable 提供了集合的枚举功能,其 GetEnumerator() 方法返回一个 IEnumerator。

IEnumerator 则实现了集合的实际迭代逻辑,定义了如何获取集合中的每一项。

foreach 循环在底层会自动调用集合的 GetEnumerator(),并使用 IEnumerator 接口的成员来完成迭代。

示例:如何一起使用 IEnumerable 和 IEnumerator

以下示例展示了如何使用这两个接口来创建一个可枚举的集合:


public class MyCollection : IEnumerable{ private string[] items = { "Item1", "Item2", "Item3" };
public IEnumerator GetEnumerator() { return new MyCollectionEnumerator(items); }}
public class MyCollectionEnumerator : IEnumerator{ private string[] items; private int position = -1;
public MyCollectionEnumerator(string[] items) { this.items = items; }
public bool MoveNext() { position++; return (position < items.Length); }
public void Reset() { position = -1; }
public object Current { get { return items[position]; } }}
// 使用示例MyCollection collection = new MyCollection();foreach (var item in collection){ Console.WriteLine(item);}


IEnumerable 是集合的抽象接口,定义了如何获取集合的迭代器(IEnumerator),使集合可以被 foreach 遍历。

IEnumerator 是迭代器接口,负责控制集合的遍历操作,实现了遍历的逻辑。

通过 IEnumerable 和 IEnumerator,.NET 提供了一个标准化的方式来处理集合迭代和枚举操作。

 .NET绿叶社区

出处:leavescn.com/Articles/Content/3445


关注公众号DotNet开发跳槽    

DotNet开发跳槽
本公众号专注为.net开发工程师提供一个学习技术及求职/跳槽的交流平台。不定期分享NET技术类文章、面试题、求助技巧等干货,原创文章300+篇,让.net开发工程师学习/面试不再迷茫。ps: 后台回复“跳槽”,免费领取.NET开发面试题!
 最新文章