using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/**
* 使用foreach循环遍历一个Person封装类数组
* 要想用foreach循环遍历一个自己的类数组,
* 这个类必须实现IEnumerable接口实现其中的GetEnumerator方法获得一个枚举器
* GetEnumerator方法需要返回一个IEnumerator类型的参数,
* 自定义一个枚举器类实现IEnumerator接口,编写其中的方法,使得返回想要的值就ok
**/
namespace foreach枚举器
{
class Program
{
static void Main(string[] args)
{
Person[] p = new Person[] {new Person("yajie",18),new Person("liupeng",19), new Person("liuxin", 20) };
Person person = new Person(p);
foreach (Person item in p)
{
Console.WriteLine(item.ToString());
}
Console.ReadKey();
}
}
/**
* 这个类中有两个构造函数,其中一个是对类中属性的初始化,
* 另一个是要传Person类型的数组,方便在使用GetEnumerator()
* 方法时传递需要遍历的数组
* */
class Person : IEnumerable
{
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
}
Person[] person;
public Person(Person[] p)
{
this.person = p;
}
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public override string ToString()
{
return this.Name + "→" + this.Age;
}
//将需要遍历的数组传递,同时返回遍历结果
public IEnumerator GetEnumerator()
{
return new PersonEnumerator(person);
}
}
//这就是一个自定义的枚举器,只要实现IEnumerator接口就ok
class PersonEnumerator : IEnumerator
{
//初始化需要遍历的数组
Person[] p;
public PersonEnumerator(Person[] person)
{
this.p = person;
}
//初始化下标
int index = -1;
//这个就是返回的当前的数据
public object Current => p[index];
//这个函数用来实现下标的移动
public bool MoveNext()
{
if(index+1< p.Length)
{
index++;
return true;
}
return false;
}
//这个函数是将下标初始化回原来的数据,方便二次遍历
public void Reset()
{
index = -1;
}
}
}
foreach循环遍历类数组
最新推荐文章于 2024-07-25 09:29:51 发布