在C#中,凡是实现了IEnumerator接口的数据类型都可以用foreach语句进行迭代访问,可是,对于自定义类型如何实现这个接口以支持foreach的迭代呢?要实现这个功能,先来看看IEnumerable和IEnumerator接口的定义:
public interface IEnumerable
{
//IEnumerable只有一个方法,返回可循环访问集合的枚举数。
IEnumerator GetEnumerator() ;
}
public interface IEnumerator
{
// 方法
//移到集合的下一个元素。如果成功则返回为 true;如果超过集合结尾,则返回false。
bool MoveNext();
// 将集合设置为初始位置,该位置位于集合中第一个元素之前
void Reset();
// 属性:获取集合中的当前元素
object Current { get; }
}
如果我们的自定义数据类型派生于这两个接口,并实现接口中的方法,即可用foreach进行迭代。
下面是一个实现的简单例子:
using System;
using System.Collections ;
using System.Collections.Generic;
using System.Text;
namespace IEnumberableTest
{
class Program
{
static void Main(string[] args)
{
myEnum enum1 = new myEnum(20);
foreach ( point p in enum1)
{
Console.WriteLine("("+p.x .ToString ()+","+p.y.ToString ()+","+p.z.ToString ()+")");
}
Console.Read();
}
}
//一个结构体,用于类myEnum
struct point
{
public int x;
public int y;
public int z;
}
//我们的一个派生于IEnumerable和IEnumerator接口的自定义类
class myEnum :IEnumerable,IEnumerator
{
//定义索引
private int index;
//定义一个point结构的数组
private point[] points;
//类的构造函数,用于初始化point结构数组
public myEnum(int numofpoint)
{
this.index = -1;
points = new point[numofpoint];
for (int i = 0; i < points.Length ; i++)
{
points[i].x = i;
points[i].y = i*i;
points[i].z = i*i*i;
}
}
//实现IEnumerable接口的GetEnumerator方法,返回一个IEnumerator,这里返回我们的自定义类,因为要对这个类的对象进行迭代
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
//实现IEnumerator接口的Reset方法,将集合索引置于第一个元素之前
public void Reset()
{
index = -1;
}
//实现IEnumerator接口的Current属性,返回一个自定义的point结构,即point数组的第index元素
public object Current
{
get
{
return points[index];
}
}
//实现IEnumerator接口的MoveNext方法,用于向前访问集合元素,如果超出集合范围,返回false
public bool MoveNext()
{
index++;
return index >= points.Length ? false : true;
}
}
}
分享到:
相关推荐
在C#编程语言中,`IEnumerable`和`IEnumerator`接口是用于实现迭代和遍历集合的关键组件。这两个接口是.NET Framework中的基础部分,主要用于支持`foreach`循环结构。本文将深入解析这两个接口的工作原理和它们在...
如果该类型是一个泛型集合,还可能需要实现IEnumerable和IEnumerator接口以支持类型安全的枚举。 具体到代码实现,我们可以参考文章中给出的Person类的示例。Person类包含一个字符串数组_names,如果我们希望...
// 实现IEnumerable接口以支持foreach public IEnumerator<ListNode> GetEnumerator() { ListNode current = head; while (current != null) { yield return current; current = current.Next; } } ...
GetEnumerator()方法返回一个实现lEnumerable接口的枚举,接着foreach语句就可以使用IEnumerable接口迭代集合了。 GetEnumerator()方法用IEnumerable接口定义,foreach语句并不真的需要在集合类中实现这个接口。有一...
IDisposable接口、IEnumerable接口和IEnumerator接口是C#中用于处理资源清理和迭代操作的关键组件。本文将深入探讨这些接口的使用及其在实际开发中的应用。 首先,IDisposable接口是C#中用于处理非托管资源释放的...
迭代器是一个实现了`IEnumerable`接口的对象,这个接口定义了一个`GetEnumerator`方法,返回一个实现了`IEnumerator`接口的对象。`IEnumerator`接口包含`Current`属性(用于获取当前元素)和`MoveNext`方法(用于...
总结起来,C#的`foreach`语句遍历集合类型的核心在于实现`IEnumerable`接口和相应的`IEnumerator`枚举器。通过这样的设计,我们可以轻松地遍历任何类型的集合,无论是内置的还是自定义的,从而提高了代码的可读性...
通过实现IEnumerable接口和IEnumerator接口,我们可以自定义一个迭代器,使其可以用foreach语句来遍历集合。 C#中foreach的实现原理基于可枚举类型和枚举器的概念。枚举器对象负责遍历集合中的每个元素,并提供当前...
class可以继承自抽象类和实现接口。 4. try-catch-finally中的finally块 finally块是在try块和catch块之后执行的代码,即使try块中有return语句,finally块仍然会执行。finally块通常用于释放资源和关闭文件等。 ...
面向对象程序设计在.NET框架中是一个核心概念,它允许开发者以更加抽象和模块化的方式处理复杂的软件问题。...通过实现`IEnumerable`和`IEnumerator`接口,开发者可以扩展这一机制,为自定义类型提供迭代能力。
数组Array、ArrayList等实现IEnumerable接口的类都可以用在foreach语句中。IEnumerator接口包含了Current属性(获取当前元素)、MoveNext方法(移动到下一个元素)和Reset方法(重置到初始位置)。 **ICollection...
面向对象程序设计中的枚举集合是.NET框架中的一个重要概念,主要涉及到枚举器(Enumerator)和可枚举类型(Enumerable)。...通过理解这些概念,开发者能够更好地设计和实现各种数据结构,提高代码的可读性和性能。
在.NET框架中,`foreach`循环是通过实现`IEnumerable`和`IEnumerator`接口来支持的。然而,有时候我们可能需要自定义一些行为,这时就需要创建自己的`ForEach`管理类。这个"一个ForEach管理类"项目正提供了这样一个...
`foreach` 不仅适用于数组,还适用于实现了 `IEnumerable` 或 `IEnumerator` 接口的任何类型,包括列表、队列、堆栈等。这是 C# 面向对象编程的一大优势。 6. **迭代器**: `foreach` 的强大之处还在于它支持...
2. 用户类若想支持 Foreach 语句需要实现的接口是:IEnumerable 或 IEnumerator。Foreach 语句可以用来枚举集合中的元素,而 IEnumerable 和 IEnumerator 是实现枚举的两个关键接口。 3..Net Framework 通过什么与 ...
它省去了实现接口的繁琐工作,降低了代码复杂性,同时也使得代码更易于理解和维护。在处理大量数据或者需要按需生成数据的场景下,`yield`关键字尤其有用,因为它可以延迟计算和内存分配,提高程序性能。通过深入...
在C#编程语言中,`foreach`语句和`yield`关键字是两个非常重要的概念,它们主要用于处理集合数据和实现自定义迭代。下面将详细介绍这两个语句及其应用。 1. `foreach`语句 `foreach`循环用于遍历可迭代对象,如数组...
五是迭代器的返回类型必须为 IEnumerable 和 IEnumerator 中的任意一种;六是迭代器是产生值的有序序列的一个语句块,不同于有一个或多个 yield 语句存在的常规语句块;七是迭代器不是一种成员,它只是实现函数成员...
枚举器(Enumerator)在C#...枚举器的实现可以利用`yield return`来提供延迟执行和迭代控制,而`foreach`则提供了简洁的语法糖来遍历任何实现了`IEnumerable`接口的对象。理解这些概念对于深入学习C#和.NET框架至关重要。