.Net行为型设计模式之迭代器模式(Iterator)

.Net行为型设计模式之迭代器模式(Iterator)

概述

迭代器模式是一种常见的行为型设计模式,它的主要作用是提供一种方法,对聚合对象中的元素进行遍历。当我们需要访问一个聚合对象中的元素时,我们可以使用迭代器模式,不必暴露该聚合对象的内部结构,从而保证了该对象的安全性。

迭代器模式分为内部迭代器和外部迭代器。内部迭代器由聚合对象自己实现,它的优点在于简单方便。而外部迭代器由客户端实现,看起来比较麻烦,但是更加灵活。

示例

在下面的示例中,我们演示了如何使用内部迭代器,来对一个简单的聚合对象进行遍历。

public class MyList<T>
{
    private List<T> list = new List<T>();

    public void Add(T item)
    {
        list.Add(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (T item in list)
        {
            yield return item;
        }
    }
}

public class Client
{
    public void Iterate()
    {
        MyList<int> list = new MyList<int>();
        list.Add(1);
        list.Add(2);

        foreach (int item in list)
        {
            Console.WriteLine(item);
        }
    }
}

在上面的代码中,MyList 类包含在 List 类型的内部聚合对象。为了支持遍历,我们实现了一个内部迭代器 GetEnumerator 方法。该方法使用 yield return 语句,将列表中的所有元素依次返回给客户端。客户端可以使用 foreach 语句,逐一遍历列表中的元素。

下面是一个使用外部迭代器的示例,它与上面的示例类似,只是使用了 IEnumerator 接口来实现迭代器。

public class MyList<T>
{
    private List<T> list = new List<T>();

    public void Add(T item)
    {
        list.Add(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new MyListIterator<T>(this);
    }

    private class MyListIterator<T> : IEnumerator<T>
    {
        private MyList<T> list;
        private int currentIndex = -1;

        public MyListIterator(MyList<T> list)
        {
            this.list = list;
        }

        public T Current => list[currentIndex];

        object IEnumerator.Current => Current;

        public void Dispose()
        {
        }

        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < list.Count;
        }

        public void Reset()
        {
            currentIndex = -1;
        }
    }
}

public class Client
{
    public void Iterate()
    {
        MyList<int> list = new MyList<int>();
        list.Add(1);
        list.Add(2);

        IEnumerator<int> iter = list.GetEnumerator();
        while (iter.MoveNext())
        {
            Console.WriteLine(iter.Current);
        }
    }
}

在这个示例中,我们还创建了一个私有内部类 MyListIterator,它实现了 IEnumerator 接口,并包含了对 MyList 对象的引用。在迭代时,我们可以使用 MoveNext 方法和 Current 属性,来访问列表中的元素。

总结

迭代器模式是一种非常实用的设计模式,可以帮助我们对聚合对象进行遍历,并保证聚合对象的安全性。在实际开发中,我们可以根据具体的需求,选择使用内部迭代器或外部迭代器。无论使用哪种迭代器,我们都应该尽量避免直接访问聚合对象,而是尽可能地使用迭代器来遍历它们。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之迭代器模式(Iterator) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# 多线程记录

    ​  开发中经常遇到不同的业务访问同一个数据源,而每一个业务的执行流就是一个线程,此时线程一多就会产生多线程最容易遇到的问题——并发。 什么是并发?         举个很经典的例子:程序中我们经常要操作一些对象,尤其是内存中的数据                    例如当前判断进入条件已经判断newModel不为空,sleep(10)称为比较耗时的运算…

    C# 2023年4月24日
    00
  • 在Asp.net core项目中使用WebSocket

    在ASP.NET Core项目中使用Websocket是一项非常重要的技能,可以让我们实现实时交互和通讯、推送等功能。下面是在ASP.NET Core项目中使用Websocket的完整攻略: 步骤一:安装Microsoft.AspNetCore.WebSockets NuGet包 WebSocket 是一个独立的协议,所以我们需要安装一个 NuGet 包来帮…

    C# 2023年6月3日
    00
  • C#中DataTable和List互转的示例代码

    下面我将详细讲解“C#中DataTable和List互转的示例代码”的完整攻略。 目录 DataTable转List 1.1 使用ToList扩展方法 1.2 使用反射自动映射 List转DataTable 2.1 使用数据表生成方式 2.2 使用反射自动映射 1. DataTable转List 1.1 使用ToList扩展方法 public static …

    C# 2023年5月31日
    00
  • C#中Linq的去重方式Distinct详解

    C#中Linq的去重方式Distinct详解 在C#中使用Linq可以方便地操作集合数据,去重是常见的操作之一,Distinct方法可以帮助我们快速实现去重。 Distinct方法的语法 使用Linq的Distinct方法可以对一个集合进行去重。其语法如下: public static IEnumerable<TSource> Distinct&…

    C# 2023年6月1日
    00
  • C# File.GetLastWriteTime(string path):获取指定文件的最后修改时间

    C# File.GetLastWriteTime(string path)方法 简介 File.GetLastWriteTime(string path)方法返回指定文件或目录的最后修改日期和时间。 使用方法 语法 public static DateTime GetLastWriteTime (string path); 参数 参数 描述 path 文件或…

    C# 2023年4月19日
    00
  • C#中判断一个集合是否是另一个集合的子集的简单方法

    判断一个集合是否是另一个集合的子集,可以使用 C# 中的 LINQ (Language Integrated Query) 扩展方法来实现。 下面是判断一个集合是否是另一个集合的子集的简单方法: using System.Linq; // 判断一个集合是否是另一个集合的子集的简单方法 public static bool IsSubset<T>(…

    C# 2023年6月8日
    00
  • C#中三种Timer计时器的详细用法

    当我们需要在C#中执行一些定时任务时,我们可以使用Timer计时器。在C#中,有三种不同的Timer计时器,分别是System.Timers.Timer、System.Threading.Timer和System.Windows.Forms.Timer。下面,我们将分别介绍它们的详细用法。 System.Timers.Timer System.Timers.…

    C# 2023年6月1日
    00
  • C# List的用法小结

    针对题目“C# List的用法小结”的完整攻略,以下是我整理的详细讲解: 1. C# List 简介 C# List是.NET Framework中的一个通用集合类,可以存储一组对象,并且可根据索引值访问列表中的元素,支持添加、删除、排序等操作。List类是泛型类,其中“T”代表一个类型参数,表示列表中存储的元素的数据类型。由于是泛型类,因此可以根据不同的需…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部