c# foreach 的实现原理,自定义一个实现foreach的类

本文详细介绍了C#中foreach语句的工作原理,以及如何配合可枚举类型如数组和自定义类实现迭代。通过Person和MyCollection类的实例,展示了GetEnumerator(),MoveNext(),和Current属性的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述:

foreach语句是被设计用来和可枚举类型一起使用,只要它的遍历对象是可枚举类型(实现了IEnumerable),比如数组。调用过程如下:

调用GetEnumerator()方法,返回一个IEnumerator引用。

调用返回的IEnumerator接口的MoveNext()方法。

如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。

重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。
1.

void Main()
{
	Person person = new Person();
	foreach (var item in person)
    {
                Console.WriteLine(item);
    }
	var Enumerator = person.GetEnumerator();
	while (Enumerator.MoveNext())
	{
		Console.WriteLine(Enumerator.Current);
    }
}

class Person
{
	string[] Datas = new string[] { "张三", "李四", "王五" };

	public PersonEnumerator GetEnumerator()
	{
		return new PersonEnumerator(Datas);
	}
}

/// <summary>
/// 迭代计数器
/// </summary>
class PersonEnumerator
{
	public PersonEnumerator(string[] datas) { this.Datas = datas; }

	/// <summary>
	/// 遍历的数据对象
	/// </summary>
	private string[] Datas;

	private int index = -1;

	/// <summary>
	/// 当前遍历到的元素
	/// </summary>
	public string Current
	{

		get { return Datas[index]; }
	}

	/// <summary>
	/// 将记录指针移至下一条
	/// </summary>
	/// <returns>是否存在尚未遍历的元素</returns>
	public bool MoveNext()
	{
		index++;
		return index < Datas.Length;
	}

}

public class MyCollection : IEnumerable<int>
{
	private int[] data = { 1, 2, 3 };

	public IEnumerator<int> GetEnumerator()
	{
		return new MyEnumerator(this);
	}

	IEnumerator IEnumerable.GetEnumerator()
	{
		return this.GetEnumerator();
	}

	private class MyEnumerator : IEnumerator<int>
	{
		private MyCollection collection;
		private int index = -1;

		public MyEnumerator(MyCollection collection)
		{
			this.collection = collection;
		}

		public bool MoveNext()
		{
			index++;
			return index < collection.data.Length;
		}

		public int Current
		{
			get
			{
				return collection.data[index];
			}
		}

		object IEnumerator.Current => Current;

		public void Reset()
		{
			index = -1;
		}

		public void Dispose() { }
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值