深入探索枚举器、迭代器与LINQ技术
立即解锁
发布时间: 2025-08-21 00:06:08 阅读量: 2 订阅数: 8 


C#编程基础与实战技巧
### 深入探索枚举器、迭代器与LINQ技术
#### 1. IEnumerable<T> 接口
泛型 `IEnumerable<T>` 接口与非泛型的 `IEnumerable` 接口非常相似。泛型版本继承自 `IEnumerable`,因此它也必须实现 `IEnumerable` 接口。
- **成员情况**:和 `IEnumerable` 一样,泛型版本也包含一个成员,即 `GetEnumerator` 方法。不过,这个版本的 `GetEnumerator` 方法返回一个实现了泛型 `IEnumerator<T>` 接口的类对象。
- **实现方式**:由于类必须实现两个 `GetEnumerator` 方法,所以应该显式实现非泛型版本,并在类级别实现泛型版本。
以下是实现泛型接口的代码模式:
```csharp
using System.Collections;
using System.Collections.Generic;
class MyGenEnumerable: IEnumerable<T>
{
public IEnumerator<T> GetEnumerator() { ... } // IEnumerable<T> version
IEnumerator IEnumerable.GetEnumerator() { ... } // IEnumerable version
...
}
```
以下是使用泛型可枚举接口的代码示例:
```csharp
using System.Collections;
using System.Collections.Generic;
class MyColors : IEnumerable<string>
{
string[] Colors = { "Red", "Yellow", "Blue" };
public IEnumerator<string> GetEnumerator() // IEnumerable<T> version
{
return new ColorEnumerator(Colors);
}
IEnumerator IEnumerable.GetEnumerator() // IEnumerable version
{
return new ColorEnumerator(Colors);
}
}
```
#### 2. 迭代器
在 .NET 集合类中,可枚举类和枚举器被广泛使用,所以了解它们的工作原理很重要。从 C# 2.0 开始,语言提供了一种更简单的创建枚举器和可枚举对象的方式,即迭代器。编译器会为我们创建这些对象,我们可以在任何使用手动编码的枚举器或可枚举对象的地方使用迭代器生成的枚举器和可枚举对象。
以下是两个实现迭代器的示例:
```csharp
public IEnumerator<string> BlackAndWhite() // Version 1
{
yield return "black";
yield return "gray";
yield return "white";
}
public IEnumerator<string> BlackAndWhite() // Version 2
{
string[] theColors = { "black", "gray", "white" };
for (int i = 0; i < theColors.Length; i++)
yield return theColors[i];
}
```
#### 3. 迭代器块
迭代器块是包含一个或多个 `yield` 语句的代码块。以下三种类型的代码块都可以是迭代器块:
- 方法体
- 访问器体
- 操作符体
迭代器块与其他代码块的处理方式不同。其他代码块包含按顺序执行的语句,而迭代器块是声明性的,它描述了编译器要构建的枚举器类的行为。迭代器块有两个特殊语句:
- `yield return` 语句指定要返回的序列中的下一项。
- `yield break` 语句指定序列中没有更多项。
编译器根据迭代器块中描述的枚举项的方式构建枚举器类,包括所有必需的方法和属性实现。生成的类嵌套在声明迭代器的类中。根据迭代器块的返回类型,迭代器可以生成枚举器或可枚举对象。
#### 4. 使用迭代器创建枚举器
以下代码展示了如何使用迭代器创建可枚举类:
```csharp
class MyClass
{
public IEnumerator<string> GetEnumerator()
{
return BlackAndWhite();
}
public IEnumerator<string> BlackAndWhite() // Iterator
{
yield return "black";
yield return "gray";
yield return "white";
}
}
class Program
{
static void Main()
{
MyClass mc = new MyClass();
foreach (string shade in mc)
Console.WriteLine(shade);
}
}
```
该代码的输出结果为:
```plaintext
black
gray
white
```
#### 5. 使用迭代器创建可枚举对象
与上一个示例不同,此示例使用迭代器创建可枚举对象而非枚举器。
```csharp
class MyClass
{
public IEnumerator<string> GetEnumerator()
{
IEnumerable<string> myEnumerable = BlackAndWhite();
return myEnumerable.GetEnumerator();
}
public IEnumerable<string> BlackAndWhite()
{
yield return "black";
yield return "gray";
yield return "white";
}
}
class Program
{
static void Main()
{
MyClass mc = new MyClass();
foreach (string shade in mc)
```
0
0
复制全文
相关推荐










