首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CSharp: Iterator Pattern in donet core 3

CSharp: Iterator Pattern in donet core 3

作者头像
geovindu
发布2026-06-18 21:37:53
发布2026-06-18 21:37:53
110
举报
代码语言:javascript
复制
/// <summary>
/// 迭代器模式 Iterator Pattern
/// geovindu,Geovin Du edit
/// </summary>
public interface IIterator
{
    /// <summary>
    /// Reset to first element
    /// 第一
    /// </summary>
 
    void First();
    /// <summary>
    /// Get next element
    /// 下一个
    /// </summary>
    /// <returns></returns>
    string Next();
    /// <summary>
    /// End of collection check
    /// 是否最生
    /// </summary>
    /// <returns></returns>
    bool IsCollectionEnds();
    /// <summary>
    /// Retrieve Current Item
    /// 是否当前
    /// </summary>
    /// <returns></returns>
    string CurrentItem();
}
 
/// <summary>
///  Science Iterator
///  科学
/// </summary>
public class ScienceIterator : IIterator
{
    /// <summary>
    /// 科目列表
    /// </summary>
    private LinkedList<string> Subjects;
    /// <summary>
    /// 位置
    /// </summary>
    private int position;
    /// <summary>
    ///
    /// </summary>
    /// <param name="subjects">输入科目列表</param>
    public ScienceIterator(LinkedList<string> subjects)
    {
        this.Subjects = subjects;
        position = 0;
    }
    /// <summary>
    /// 第一个位置,0开始
    /// </summary>
    public void First()
    {
        position = 0;
    }
    /// <summary>
    /// 下一个位置,加1
    /// </summary>
    /// <returns></returns>
    public string Next()
    {
        return Subjects.ElementAt(position++);
    }
    /// <summary>
    /// 是否最后
    /// </summary>
    /// <returns></returns>
    public bool IsCollectionEnds()
    {
        if (position < Subjects.Count)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    /// <summary>
    /// 当前目录
    /// </summary>
    /// <returns></returns>
    public string CurrentItem()
    {
        return Subjects.ElementAt(position);
    }
}
/// <summary>
///  Arts Iterator
///  行为艺术
/// </summary>
public class ArtsIterator : IIterator
{
    /// <summary>
    /// 科目列表
    /// </summary>
    private string[] Subjects;
    /// <summary>
    /// 位置位
    /// </summary>
    private int position;
    /// <summary>
    /// 行位艺术构造对象
    /// </summary>
    /// <param name="subjects">输入科目列表</param>
    public ArtsIterator(string[] subjects)
    {
        this.Subjects = subjects;
        position = 0;
    }
    /// <summary>
    /// 第一
    /// </summary>
    public void First()
    {
        position = 0;
    }
    /// <summary>
    /// 下一个
    /// </summary>
    /// <returns></returns>
    public string Next()
    {
        //Console.WriteLine("Currently pointing to the subject: "+ this.CurrentItem());
        return Subjects[position++];
    }
    /// <summary>
    /// 是否最后
    /// </summary>
    /// <returns></returns>
    public bool IsCollectionEnds()
    {
        if (position >= Subjects.Length)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /// <summary>
    /// 当前
    /// </summary>
    /// <returns></returns>
    public string CurrentItem()
    {
        return Subjects[position];
    }
}
#endregion
 
#region Aggregate
/// <summary>
///
/// </summary>
public interface ISubjects
{
    IIterator CreateIterator();
}
/// <summary>
/// 科学
/// </summary>
public class Science : ISubjects
{
    /// <summary>
    /// 科目列表
    /// </summary>
    private LinkedList<string> Subjects;
    /// <summary>
    /// 科学构造对象方法
    ///
    /// </summary>
    public Science()
    {
        Subjects = new LinkedList<string>();
        Subjects.AddFirst("Mathematics 应用数学");
        Subjects.AddFirst("Computer Science计算机科学");
        Subjects.AddFirst("Physics物理学");
        Subjects.AddFirst("Electronics电子学");
    }
    /// <summary>
    /// 创建对象
    /// </summary>
    /// <returns></returns>
    public IIterator CreateIterator()
    {
        return new ScienceIterator(Subjects);
    }
}
/// <summary>
/// 行为艺术
/// </summary>
public class Arts : ISubjects
{
    /// <summary>
    /// 科目列表
    /// </summary>
    private string[] Subjects;
    /// <summary>
    /// 构造行为艺术对象
    /// </summary>
    public Arts()
    {
        Subjects = new[] { "English英语", "History历史", "Geography地理", "Psychology心理学" };
    }
    /// <summary>
    /// 创建一个对象方法
    /// </summary>
    /// <returns></returns>
    public IIterator CreateIterator()
    {
        return new ArtsIterator(Subjects);
    }
}

代码语言:javascript
复制
/// <summary>
  /// 迭代器模式 Iterator Pattern
  /// geovindu,Geovin Du edit
  /// </summary>
  /// <typeparam name="T"></typeparam>
  public class Node<T>
  {
      /// <summary>
      ///
      /// </summary>
      ///
      public T Value;
      /// <summary>
      ///
      /// </summary>
      public Node<T> Left, Right;
      /// <summary>
      ///
      /// </summary>
      public Node<T> Parent;
      /// <summary>
      ///
      /// </summary>
      /// <param name="value"></param>
      public Node(T value)
      {
          Value = value;
      }
      /// <summary>
      ///
      /// </summary>
      /// <param name="value"></param>
      /// <param name="left"></param>
      /// <param name="right"></param>
      public Node(T value, Node<T> left, Node<T> right)
      {
          Value = value;
          Left = left;
          Right = right;
 
          left.Parent = right.Parent = this;
      }
  }
  /// <summary>
  ///
  /// </summary>
  /// <typeparam name="T"></typeparam>
  public class InOrderIterator<T>
  {
 
      /// <summary>
      ///
      /// </summary>
      public Node<T> Current { get; set; }
      /// <summary>
      ///
      /// </summary>
      private readonly Node<T> root;
      /// <summary>
      ///
      /// </summary>
      private bool yieldedStart;
      /// <summary>
      ///
      /// </summary>
      /// <param name="root"></param>
      public InOrderIterator(Node<T> root)
      {
          this.root = Current = root;
          while (Current.Left != null)
              Current = Current.Left;
      }
      /// <summary>
      ///
      /// </summary>
      public void Reset()
      {
          Current = root;
          yieldedStart = true;
      }
      /// <summary>
      ///
      /// </summary>
      /// <returns></returns>
      public bool MoveNext()
      {
          if (!yieldedStart)
          {
              yieldedStart = true;
              return true;
          }
 
          if (Current.Right != null)
          {
              Current = Current.Right;
              while (Current.Left != null)
                  Current = Current.Left;
              return true;
          }
          else
          {
              var p = Current.Parent;
              while (p != null && Current == p.Right)
              {
                  Current = p;
                  p = p.Parent;
              }
              Current = p;
              return Current != null;
          }
      }
  }
 
  /// <summary>
  ///
  /// </summary>
  /// <typeparam name="T"></typeparam>
  public class BinaryTree<T>
  {
 
      /// <summary>
      ///
      /// </summary>
      private Node<T> root;
      /// <summary>
      ///
      /// </summary>
      /// <param name="root"></param>
      public BinaryTree(Node<T> root)
      {
          this.root = root;
      }
      /// <summary>
      ///
      /// </summary>
      /// <returns></returns>
      public InOrderIterator<T> GetEnumerator()
      {
          return new InOrderIterator<T>(root);
      }
      /// <summary>
      ///
      /// </summary>
      public IEnumerable<Node<T>> NaturalInOrder
      {
          get
          {
              IEnumerable<Node<T>> TraverseInOrder(Node<T> current)
              {
                  if (current.Left != null)
                  {
                      foreach (var left in TraverseInOrder(current.Left))
                          yield return left;
                  }
                  yield return current;
                  if (current.Right != null)
                  {
                      foreach (var right in TraverseInOrder(current.Right))
                          yield return right;
                  }
              }
              foreach (var node in TraverseInOrder(root))
                  yield return node;
          }
      }
  }
代码语言:javascript
复制
/// <summary>
/// 迭代器模式 Iterator Pattern
/// geovindu,Geovin Du edit
/// </summary>
public static class GeovinDuPrint
{
 
    /// <summary>
    /// 打印
    /// </summary>
    /// <param name="iterator"></param>
    public static void Print(IIterator iterator)
    {
        while (!iterator.IsCollectionEnds())
        {
            Console.WriteLine(iterator.Next());
        }
    }
}

调用:

代码语言:javascript
复制
 Console.WriteLine("***迭代器模式  Iterator Pattern Demonstration.***");
    //For Science
    ISubjects subjects= new Science();
    IIterator iterator = subjects.CreateIterator();
    Console.WriteLine("\nScience subjects科学课程: :");
    GeovinDuPrint.Print(iterator);
 
    //For Arts
    subjects = new Arts();           
    iterator = subjects.CreateIterator();
    Console.WriteLine("\nArts subjects 艺术课程:");
    GeovinDuPrint.Print(iterator);
    Console.WriteLine();
 
 
    //
    var root = new Node<int>(1,
new Node<int>(2), new Node<int>(3));
 
    // C++ style
    var it = new InOrderIterator<int>(root);
 
    while (it.MoveNext())
    {
        Console.WriteLine(it.Current.Value);
        Console.WriteLine(',');
    }
    Console.WriteLine();
 
    // C# style
    var tree = new BinaryTree<int>(root);
 
    Console.WriteLine(string.Join(",", tree.NaturalInOrder.Select(x => x.Value)));
 
    // duck typing!
    foreach (var node in tree)
        Console.WriteLine(node.Value);
 
 
    Console.ReadLine();
代码语言:javascript
复制
***迭代器模式  Iterator Pattern Demonstration.***
 
Science subjects科学课程: :
Electronics电子学
Physics物理学
Computer Science计算机科学
Mathematics 应用数学
 
Arts subjects 艺术课程:
English英语
History历史
Geography地理
Psychology心理学
 
2
,
1
,
3
,
 
2,1,3
2
1
3
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档