C#数组(2)--枚举器迭代
时间:2011-03-26 来源:任银
数组实现的接口:
IEnumerable--用于迭代
ICollection--派生于IEnumerable接口,用于确定集合元素个数等
IList--派生于ICollection接口,Array类主要定义了Item索引访问器等,而对于集合所需的成员异常实现
枚举器迭代:
IEnumerator接口--用于迭代集合中的所有元素,实现成员MoveNext(),Current,ReSet()
foreach语句使用了IEnumerator的接口和属性
foreach语句解析
foreach(Pseron p in persons)
{
Console.WriteLine(p);
}
不解析为IL 而是
IEnumerator enumerator = persons.GetEnumerator();
while(enumerator.MoveNext())
{
Pseron p = (Person)enumerator.Current;
Console.WriteLine(p);
}
枚举器迭代 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 枚举器迭代
{
public class HelloCollection
{
//自定义实现GetEnumerator()方法返回枚举器
public IEnumerator GetEnumerator()
{
//yield return返回集合的一个元素,并移动到下一个
//yield break停止迭代
yield return "Hello";
yield return "World";
}
}
class Program
{
static void Main(string[] args)
{
HelloCollection helloCollection = new HelloCollection();
foreach (string s in helloCollection)
{
Console.WriteLine(s);
}
//foreach语句使用了IEnumerator的接口和属性
//解析为
//IEnumerator enumerator = helloCollection.GetEnumerator();
//while (enumerator.MoveNext())
//{
// string s = enumerator.Current.ToString();
// Console.WriteLine(s);
//}
}
}
}
yeild语句称为迭代块,yeild类型包含一个状态机,执行IEnumerator和IDisposable接口的方法和属性
yield_return实现集合的 倒序输出 子集合输出 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace yield_return实现集合的 倒序输出 子集合输出
{
public class MusicTitles
{
string[] names ={
"Tubular Bells","Hergest Ridge",
"Ommadawn","Platinum"};
//foreach数组时 默认调用GetEnumerator 因此该方法可以不写
public IEnumerator GetEnumerator()
{
for (int i = 0; i < 4; i++)
{
yield return names[i];
}
}
//倒序输出
public IEnumerable Reverse()
{
for (int i = 3; i >= 0; i--)
{
yield return names[i];
}
}
//子集输出
public IEnumerable Subset(int index, int length)
{
for (int i = index; i < index + length; i++)
{
yield return names[i];
}
}
}
class Program
{
static void Main(string[] args)
{
MusicTitles titles = new MusicTitles();
foreach (string title in titles)
{
Console.WriteLine(title);
}
Console.WriteLine();
Console.WriteLine("reverse");
foreach (string title in titles.Reverse())
{
Console.WriteLine(title);
}
Console.WriteLine();
Console.WriteLine("subset");
foreach (string title in titles.Subset(2, 2))
{
Console.WriteLine(title);
}
}
}
}
相关阅读 更多 +