各种集合都可以是foreach来实现迭代访问,下面我们自定义集合类来实现foreach迭代访问
各种集合类之所以能使用foreach就是因为集合的继承了IEnumeable这个接口,而这个接口中最重要的是GetEnumerator()这个函数,它返回的是一个IEnumerator这个接口类型,这个接口为foreach提供了访问条件,如果我们在实现这个GetEnumerator函数时不使用yield关键字我们就需要手动去实现一个继承自IEnumerator接口的类,在这个内中我们需要实现MoveNext方法,getcurrent属性等相关代码,然后我们在GetEnumerator调用时再将我们的集合类作为参数放到继承IEnumerator接口的类构造中,这样就会非常麻烦,所以我们使用yield关键字来进行迭代,简化了我们的工作。
所以编写一个迭代类步骤如下:
1.继承接口IEnumerable<T>或IEnumerable(具体看是否写成泛型)
2.实现接口的两个函数,重点实现GetEnumerator()函数使用yield return返回我们的集合元素
3.外部直接对这个集合类使用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迭代使用