当前位置:首页 > C# > 正文

C#设计模式详解:迭代器模式(轻松掌握集合遍历的优雅方式)

在软件开发中,我们经常需要遍历集合中的元素,比如遍历一个列表、数组或者自定义的数据结构。如果每次都要写一堆 for 或 foreach 循环,不仅代码冗余,而且难以维护。这时候,迭代器模式就派上用场了!

本文将带你从零开始理解 C#设计模式 中的 迭代器模式,即使是编程小白也能轻松上手。我们将通过实际代码示例,讲解如何在 C# 中实现和使用迭代器模式,并了解它带来的好处。

什么是迭代器模式?

迭代器模式(Iterator Pattern) 是一种行为型设计模式,它提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

简单来说,就是把“遍历”这个操作从集合类中抽离出来,封装到一个独立的“迭代器”类中。这样,集合类只负责存储数据,而遍历逻辑由迭代器来处理。

C#设计模式详解:迭代器模式(轻松掌握集合遍历的优雅方式) C#设计模式 迭代器模式 C#迭代器 设计模式教程 第1张

为什么使用迭代器模式?

  • 解耦集合与遍历逻辑
  • 支持多种遍历方式(正序、倒序、跳过等)
  • 符合“单一职责原则”——集合只管存储,迭代器只管遍历
  • 便于扩展新的集合类型,无需修改客户端代码

C# 中的内置迭代器支持

其实,C# 早已内置了对迭代器的支持!你每天都在用的 foreach 循环,底层就是基于迭代器模式实现的。

只要一个类实现了 IEnumerable 接口(或 IEnumerable<T>),它就可以被 foreach 遍历。而 IEnumerable 接口要求返回一个实现了 IEnumerator 的对象——这就是标准的迭代器。

手把手实现一个自定义迭代器

下面我们来创建一个简单的“书架”类(BookShelf),并为它实现一个自定义迭代器。

1. 定义书籍类

public class Book{    public string Title { get; set; }    public Book(string title)    {        Title = title;    }    public override string ToString()    {        return Title;    }}

2. 实现自定义集合(BookShelf)

using System.Collections;using System.Collections.Generic;public class BookShelf : IEnumerable<Book>{    private List<Book> _books = new List<Book>();    public void AddBook(Book book)    {        _books.Add(book);    }    // 实现 IEnumerable<Book> 接口    public IEnumerator<Book> GetEnumerator()    {        return new BookShelfIterator(_books);    }    // 显式实现非泛型版本    IEnumerator IEnumerable.GetEnumerator()    {        return GetEnumerator();    }}

3. 创建自定义迭代器(BookShelfIterator)

using System.Collections;using System.Collections.Generic;public class BookShelfIterator : IEnumerator<Book>{    private List<Book> _books;    private int _currentIndex = -1;    public BookShelfIterator(List<Book> books)    {        _books = books;    }    public Book Current => _books[_currentIndex];    object IEnumerator.Current => Current;    public bool MoveNext()    {        _currentIndex++;        return _currentIndex < _books.Count;    }    public void Reset()    {        _currentIndex = -1;    }    public void Dispose()    {        // 如果有非托管资源,这里释放    }}

4. 使用示例

class Program{    static void Main(string[] args)    {        var shelf = new BookShelf();        shelf.AddBook(new Book("C#高级编程"));        shelf.AddBook(new Book("设计模式之美"));        shelf.AddBook(new Book("算法导论"));        // 使用 foreach 遍历 —— 这就是迭代器模式的体现!        foreach (var book in shelf)        {            Console.WriteLine(book);        }    }}

运行结果:

C#高级编程设计模式之美算法导论

更简单的写法:使用 yield 关键字

其实,在 C# 中,你甚至不需要手动实现 IEnumerator!使用 yield return 可以让编译器自动为你生成迭代器。

public class SimpleBookShelf : IEnumerable<Book>{    private List<Book> _books = new List<Book>();    public void AddBook(Book book) => _books.Add(book);    public IEnumerator<Book> GetEnumerator()    {        foreach (var book in _books)        {            yield return book;        }    }    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}

这种方式更简洁,也更常用。但理解底层原理(即手动实现迭代器)对于掌握 C#迭代器 的工作机制非常重要。

总结

通过本篇 设计模式教程,你已经学会了:

  • 迭代器模式的核心思想
  • 如何在 C# 中手动实现迭代器
  • 如何使用 yield 简化迭代器编写
  • 为什么迭代器模式能提高代码的可维护性和扩展性

记住,C#设计模式 不是炫技,而是解决实际问题的工具。当你下次需要遍历一个复杂结构时,不妨想想:是否可以用迭代器模式让它变得更优雅?

掌握 C#迭代器,让你的代码更专业、更灵活!