• 使用IEnumerator和IEnumeratable实现自定义类型的foreach访问


    让自己定义的类型可以支持foreach需要类继承:IEnumeratable

    还要有自己的迭代器(IEnumerator)

    示例如下:

    public class Test
    {
    public class User
    {
    public string UserName;

    public string Password;
    public User(string UserName, string Password)
    {
    this.UserName = UserName;
    this.Password = Password;
    }
    }
    public class UserGroup
    {
    private User[] UserSet;

    public UserGroup(User[] UserArray)
    {
    UserSet = new User[UserArray.Length];
    for (int i = 0; i < UserArray.Length; i++)
    {
    UserSet[i] = UserArray[i];
    }
    }

    public IEnumerator GetEnumerator()
    {
    return new SinglePoint(UserSet);
    }

    }

    public class SinglePoint : IEnumerator
    {
    /// <summary>
    /// SingleSetPoint
    /// </summary>
    public User[] SingleSetPoint;

    /// <summary>
    /// 迭代器当前指针的指示标志
    /// </summary>
    int Position = -1;

    /// <summary>
    /// SinglePoint的赋值:指向一堆无管理的Single
    /// </summary>
    /// <param name="list"></param>
    public SinglePoint(User[] list)
    {
    SingleSetPoint = list;
    }

    /// <summary>
    /// 接口IEnumerator的实现函数,迭代器下移。foreach用到,我们不调用。
    /// </summary>
    /// <returns></returns>
    public bool MoveNext()
    {
    Position++;
    return (Position < SingleSetPoint.Length);
    }

    /// <summary>
    /// 接口IEnumerator的实现函数,迭代器复位。foreach用到,我们不调用。
    /// </summary>
    public void Reset()
    {
    Position = -1;
    }

    /// <summary>
    /// 接口IEnumerator的实现函数,获取当前值。foreach用到,我们不调用。
    /// </summary>
    public object Current
    {
    get
    {
    try
    {
    return SingleSetPoint[Position];
    }
    catch (IndexOutOfRangeException)
    {
    throw new InvalidOperationException();
    }
    }
    }
    }

    public void IEnumeratorAndIEnumeratable()
    {
    User[] userA = new User[3]
    {
    new User("1","1"),
    new User("2","2"),
    new User("3","3")
    };
    UserGroup ugp = new UserGroup(userA);
    foreach (User user in ugp)
    {
    Console.WriteLine("用户名:" + user.UserName + "。密码:" + user.Password);
    }
    Console.ReadKey();
    }
    }


    -------------------------------------------------- 技术很菜却一直想做大牛!
  • 相关阅读:
    SpringMVC之@RequestMapping、ThreadLocal、DBCP、JNDI数据源管理
    安全威胁的分类
    软件可靠性的一些关注点
    LibTomMath + vs2008,安装和测试程序
    winxp下,Ice3.4.1 + VS2008_sp1,这个组合安装有点麻烦
    逗号操作符简化代码
    转,F5负载均衡算法及基本原理(Intro to Load Balancing)
    JVM大内存分析,不推荐jmap+jhat,推荐JProfiler
    选择soapUI做性能测试,这就是悲剧的开始
    关于linux LVM的好图 (Logic Volume Management,逻辑卷管理)
  • 原文地址:https://www.cnblogs.com/chinaboyzzy/p/4730254.html
Copyright © 2020-2023  润新知