• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C# IEnumerable和IEnumrator用法

OC/C/C++ 水墨上仙 1158次浏览

C# IEnumerable和IEnumrator用法

/*
 * Created by SharpDevelop.
 * User: Owner
 * Date: 2012-12-14
 * Time: 13:43
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections;
/// <summary>
/// IEnumerable和IEnumrator组合起来使用实现foreach。
/// </summary>
namespace TestIEnumeratorAndIEnumratable
{
	/// <summary>
	/// 个体类:这个类保存了单个体的信息和一个方法
	/// </summary>
	public class 个体
	{
		public string 信息1;
		public string 信息2;
		
		public 个体(string 信息1, string 信息2)
		{
			this.信息1 = 信息1;
			this.信息2 = 信息2;
		}
		
		public void 报数()
		{
			Console.WriteLine(this.信息1 + " = " + this.信息2);
		}
	}
	
	/// <summary>
	/// 集体类:继承自IEnumerable接口,并提供foreach的可能。
	/// </summary>
	public class 集体 : IEnumerable
	{
		/// <summary>
		/// 集体就是一票个体
		/// </summary>
		private 个体[] 一票个体;
		
		/// <summary>
		/// 这个集体为了简便,是有初始的一群个体凑一块组成的。
		/// </summary>
		/// <param name="pArray"></param>
		public 集体(个体[] pArray)
		{
			一票个体 = new 个体[pArray.Length];
			for (int i = 0; i < pArray.Length; i++)
				一票个体[i] = pArray[i];
		}
		
		/// <summary>
		/// 接口IEnumerable的实现函数,获取foreach用到的迭代器
		/// </summary>
		/// <returns></returns>
		public IEnumerator GetEnumerator()
		{
			return new 个体指针(一票个体);
		}
	}
	
	/// <summary>
	/// 个体指针:针对个体类的迭代器,继承自IEnumerator。
	/// 提供了迭代器的走向函数支持。
	/// </summary>
	public class 个体指针 : IEnumerator
	{
		/// <summary>
		/// 一票个体的指针
		/// </summary>
		public 个体[] 一票个体的指针;
		
		/// <summary>
		/// 迭代器当前位置的指示标志
		/// </summary>
		int 位置 = -1;
		
		/// <summary>
		/// 个体指针的赋值:指向一堆无管理的个体
		/// </summary>
		/// <param name="list"></param>
		public 个体指针(个体[] list)
		{
			一票个体的指针 = list;
		}
		
		/// <summary>
		/// 接口IEnumerator的实现函数,迭代器下移。foreach用到,我们不调用。
		/// </summary>
		/// <returns></returns>
		public bool MoveNext()
		{
			位置++;
			return (位置 < 一票个体的指针.Length);
		}
		
		/// <summary>
		/// 接口IEnumerator的实现函数,迭代器复位。foreach用到,我们不调用。
		/// </summary>
		public void Reset()
		{
			位置 = -1;
		}
		
		/// <summary>
		/// 接口IEnumerator的实现函数,获取当前值。foreach用到,我们不调用。
		/// </summary>
		public object Current
		{
			get
			{
				try
				{
					return 一票个体的指针[位置];
				}
				catch(IndexOutOfRangeException)
				{
					throw new InvalidOperationException();
				}
			}
		}
	}
	class Program
	{
		public static void Main(string[] args)
		{
			个体[] 个体集合 = new 个体[3]
			{
				new 个体("1", "One"),
				new 个体("2", "Two"),
				new 个体("3", "Three")
			};
			
			集体 list = new 集体(个体集合);
			foreach (个体 p in list)
				p.报数();
			
			Console.ReadKey();
		}
	}
}

上面的示例很清楚的演示了IEnumerator(迭代器接口)和IEnumerable(遍历接口)的用法。普遍代表一切。
我想用个体和集体的概念可以更容易理解这个功能。
照我目前理解,单独的IEnumerator接口没有任何用处。
IEnumerable接口可以和系统提供的各种继承自IEnumerator的类(ArrayList,Queue等)来配合,而没有必要每次都实现。


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C# IEnumerable和IEnumrator用法
喜欢 (0)
加载中……