Function: custom class implements IEnumerable and IEnumerator interfaces
/// <summary>
/// 功能:自定义类实现IEnumerable和IEnumerator接口
/// </summary>
public class IEnumerableCode : MonoBehaviour
{
void Start()
{
// Foreach_Test_1();
// Foreach_Test_2();
// Foreach_Test_3();
DebugSample();
}
void Foreach_Test_1()
{
List<int> intList = new List<int>() {1,2,3,4,5};
foreach(var item in intList)
{
Debug.Log("完整写:"+item);
}
// List继承IEnumerable类 可调用遍历元素方法
intList.ForEach( a => { Debug.Log("简写:"+a); });
}
void Foreach_Test_2()
{
Student a = new Student(0,"a");
Student b = new Student(1,"b");
Student c = new Student(2,"c");
Student[] studentsInOneClass = new Student[3]{a,b,c};
// 集合同样继承IEnumerable类 可以使用Foreach进行遍历
foreach(var item in studentsInOneClass)
{
Debug.Log($"普通输出id:{item.id}");
}
ClassSimpleIEnumerable classSimpleOne = new ClassSimpleIEnumerable(1,studentsInOneClass);
foreach(Student item in classSimpleOne)
{
Debug.Log($"实现迭代器输出名字name:{item.name}");
}
}
void Foreach_Test_3()
{
IEnumerator iterator = TestIEnumerator01().GetEnumerator();
while(iterator.MoveNext())
{
Debug.Log("游标移动测试:"+iterator.Current);
}
}
IEnumerable TestIEnumerator01()
{
for(int i = 0;i<5;i++)
{
yield return i;
}
/* 空返回值NULL */
// yield return null;
}
/* 对每第N个数据元素进行采样的方法 */
IEnumerable<T> Sample<T>(IEnumerable<T> sourceSequence, int interval)
{
int index = 0;
foreach(T item in sourceSequence)
{
// ++index 3,6,9 index++ 1,4,7,10
if(index++ % interval == 0)
yield return item;
}
}
void DebugSample()
{
IEnumerator iterator = Sample<int>(new int[] {1,2,3,4,5,6,7,8,9,10},3).GetEnumerator();
while(iterator.MoveNext())
{
Debug.Log(iterator.Current);
}
}
public class Student
{
public int id;
public string name;
public Student(int id, string name)
{
this.id = id;
this.name = name;
}
}
public class ClassSimpleIEnumerable : IEnumerable
{
private int index;
private Student[] students;
public ClassSimpleIEnumerable(int index, Student[] students)
{
this.index = index;
this.students = students;
}
public IEnumerator GetEnumerator()
{
Debug.Log("Use Array GetEnumerator");
return students.GetEnumerator();
}
// /* 上方代码已继承数字的IEnumerator */
// public class ClassSimpleIEnumerator : IEnumerator
// {
// private int index;
// private ClassSimpleIEnumerable c;
// public ClassSimpleIEnumerator(ClassSimpleIEnumerable c)
// {
// this.c = c;
// }
// object IEnumerator.Current {get{ return c.students[index];}}
// public bool MoveNext()
// {
// if(index < c.students.Length - 1 )
// {
// index++;
// return true;
// }
// else
// {
// return false;
// }
// }
// public void Reset()
// {
// index = -1;
// Debug.Log("ReSet");
// }
// }
}
public class ClassGenericIEnumerable : IEnumerable<Student>
{
private int id;
private Student[] students;
public ClassGenericIEnumerable(int id, Student[] students)
{
this.id = id;
this.students = students;
}
IEnumerator IEnumerable.GetEnumerator()
{
Debug.Log("Use Array GetEnumerator");
return students.GetEnumerator();
}
IEnumerator<Student> IEnumerable<Student>.GetEnumerator()
{
Debug.Log("Use Self GetEnumerator");
return new ClassGenericIEnumerator(this);
}
public class ClassGenericIEnumerator : IEnumerator<Student>
{
private int index = -1;
private ClassGenericIEnumerable c;
public ClassGenericIEnumerator(ClassGenericIEnumerable c)
{
this.c = c;
}
public Student Current {get {return c.students[index];}}
object IEnumerator.Current {get{return c.students[index];}}
public void Dispose()
{
Debug.Log("Dispose");
}
public bool MoveNext()
{
if(index < c.students.Length - 1)
{
index++;
return true;
}
else
{
return false;
}
}
public void Reset()
{
index = -1;
Debug.Log("Reset");
}
}
}
}