惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
有赞技术团队
有赞技术团队
Jina AI
Jina AI
H
Help Net Security
D
Docker
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
MyScale Blog
MyScale Blog
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
美团技术团队
M
MIT News - Artificial intelligence
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家

博客园 - star163

开源项目管理工具 [转]项目管理和版本跟踪——Redmine和SVN的结合 [转]在项目管理工具Redmine中使用SubVersion进行版本管理 [转]非常全的javascript控制MediaPlayer与realplayer对象 [转]让VS2008支持JQUERY的javascript语法提示 [转]强烈推荐:jQuery-240多个jQuery插件 [转]详谈基于JSON的高级AJAX开发技术 使用JavaScript中的ActiveXObject填充并设置Excel格式 - star163 - 博客园 [转]ASP.NET MVC Framework 尝鲜小试 - star163 MVC资源 [转]ASP.NET MVC 框架路线图更新 [转]用WMI实现Windows系统自动管理(多图) 优秀开源资源 UPDATE实现多表更新 [转]50种方法巧妙优化SQL Server数据库 [转]使用面向对象的技术创建高级 Web 应用程序 NET常用设计模式——代理(Proxy)模式 NET常用设计模式——组合模式 NET常用设计模式——单件模式
.NET常用设计模式——迭代器模式
star163 · 2007-12-23 · via 博客园 - star163

迭代器模式(Iterator)

  • 封装多个元素
  • 使用户正确使用
  • 遍历内部内容

总结Iterator

  • 使用标准接口遍历列表/集合
  • 封装操作
  • 提供后期操功能作扩展

应用实例

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;namespace CSDesingPattern
{
    
public class Employee
    {
        
private int EmpId = 0;
        
private string EmpName = "";public int ID
        {
            
get
            {
                
return EmpId;
            }
            
set
            {
                EmpId 
= value;
            }
        }
        
public string Name
        {
            
get
            {
                
return EmpName;
            }
            
set
            {
                EmpName 
= value;
            }
        }
    }
//集合类
    public class Employees
    {
        
private ArrayList arEmp = new ArrayList();
        
private int EmpCount;public Employees()
        {

            SqlConnection cn 

= new SqlConnection
                (
"server=localhost;database=northwind;uid=sa;pwd=windows");
            SqlCommand cmd 
= new SqlCommand
                (
"select EmployeeID,FirstName,BirthDate from Employees", cn);
            cn.Open();
            SqlDataReader dr 
= cmd.ExecuteReader();while (dr.Read())
            {
                Employee obj 
= new Employee();
                obj.ID 
= dr.GetInt32(0);
                obj.Name 
= dr.GetString(1);
                arEmp.Add(obj);
            }

            EmpCount 

= arEmp.Count;
        }
public Employee Item(int idx)
        {
            
return (Employee)arEmp[idx];
        }
public int Count
        {
            
get
            {
                
return EmpCount;
            }
        }
    }
//迭代器实现类
    public class EmployeesIterator
    {
        
private int intCurrent;
        
private Employees mObj;public EmployeesIterator(ref Employees obj)
        {

            intCurrent 

= 0;
            mObj 
= obj;
        }
public Employee MoveFirst()
        {
            intCurrent 
= 0;return mObj.Item(intCurrent);
        }
        
public Employee MoveLast()
        {
            intCurrent 
= mObj.Count - 1;return mObj.Item(intCurrent);
        }
        
public Employee MoveNext()
        {
            intCurrent 
= intCurrent + 1;
            
if (intCurrent >= mObj.Count)
            {
                intCurrent 
= mObj.Count - 1;throw new Exception("索引超过下限");
            }
            
return mObj.Item(intCurrent);
        }
public Employee MovePrev()
        {
            
//throw new Exception (intCurrent.ToString());
            intCurrent = intCurrent - 1;if (this.intCurrent == -1)//||this.intCurrent <=0) 
            {
                intCurrent 
= 1;
                
throw new Exception("索引超过上限,当前为" + intCurrent.ToString());
            }
            
return mObj.Item(intCurrent);
        }
    }

}