IEnumerable只包含一个抽象的方法 Getnumberator(),返回一个可用于循环访问集合的IEnumerator的对象。
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
IEnumerator他是一个真正的集合访问器,没有它就不能使用foreach语句遍历数组或集合,因为只有IEnumerator对象才能访问集合中的项,该接口包含了一个Current属性,MoveNext()、Reset()两个方法。
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
实现自定义类型用foreach遍历
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IEnumerableAndIEnumerator
{
public class Member
{
public string m_name = "";
public int m_age = 0;
public Member(string name,int age)
{
m_name = name;
m_age = age;
}
}
public class NBA
{
Member[] member = new Member[5];
public NBA()
{
member[0] = new Member("詹姆斯",36);
member[1] = new Member("欧文", 27);
member[2] = new Member("乔治", 28);
member[3] = new Member("威少", 30);
member[4] = new Member("韦德", 34);
}
}
class Program
{
static void Main(string[] args)
{
NBA nba = new NBA();
foreach(Member val in nba) //报错,该类型不包含GetEnumerator()公共定义,因此foreach语句不能作用该类型变量
{
Console.WriteLine(val.m_name, val.m_age);
}
}
}
}
继承IEnumerable接口
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IEnumerableAndIEnumerator
{
public class Member
{
public string m_name = "";
public int m_age = 0;
public Member(string name,int age)
{
m_name = name;
m_age = age;
}
}
public class NBA : IEnumerable //继承IEnumerable接口
{
Member[] member = new Member[5];
public NBA()
{
member[0] = new Member("詹姆斯",36);
member[1] = new Member("欧文", 27);
member[2] = new Member("乔治", 28);
member[3] = new Member("威少", 30);
member[4] = new Member("韦德", 34);
}
public IEnumerator GetEnumerator()
{
return this.member.GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
NBA nba = new NBA();
foreach(Member val in nba)
{
Console.WriteLine(val.m_name+val.m_age);
}
}
}
}