关闭

c#创建自定义集合类并使之支持使用foreach迭代

450人阅读 评论(0) 收藏 举报
分类:
各种集合都可以是foreach来实现迭代访问,下面我们自定义集合类来实现foreach迭代访问
using System;
using System.Collections.Generic;
class myclass<T>:IEnumerable<T>   //为了使类能被迭代需要继承IEnumeable这个接口
{
    private List<T> mylist=new List<T>();  //在类中定义集合
    public myclass()
    { 
    }
    public void Insert(T data)    //用于插入数据
    {
        mylist.Add(data);
    }
    public IEnumerator<T> GetEnumerator()   //实现接口中的方法
    {
        foreach (T item in mylist)
            yield return item;   //这里使用yield可以非常简化我们工作量不用我们自己去写一个继承IEnumerator
                                 //的类,这样编译器帮我做了很多事情
    }
    //接口中的方法
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

class Test
{
    public static void Main()
    {
        myclass<string> my = new myclass<string>();
        my.Insert("ni");
        my.Insert("hao");
        my.Insert("ma");
        foreach (string item in my)   //使用foreach对集合类进行迭代
            Console.WriteLine(item);
    }
}
说明:
各种集合类之所以能使用foreach就是因为集合的继承了IEnumeable这个接口,而这个接口中最重要的是GetEnumerator()这个函数,它返回的是一个IEnumerator这个接口类型,这个接口为foreach提供了访问条件,如果我们在实现这个GetEnumerator函数时不使用yield关键字我们就需要手动去实现一个继承自IEnumerator接口的类,在这个内中我们需要实现MoveNext方法,getcurrent属性等相关代码,然后我们在GetEnumerator调用时再将我们的集合类作为参数放到继承IEnumerator接口的类构造中,这样就会非常麻烦,所以我们使用yield关键字来进行迭代,简化了我们的工作。
所以编写一个迭代类步骤如下:
1.继承接口IEnumerable<T>或IEnumerable(具体看是否写成泛型)   
2.实现接口的两个函数,重点实现GetEnumerator()函数使用yield return返回我们的集合元素
3.外部直接对这个集合类使用foreach迭代使用
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38283次
    • 积分:1338
    • 等级:
    • 排名:千里之外
    • 原创:96篇
    • 转载:26篇
    • 译文:0篇
    • 评论:0条
    文章分类