C# IEnumerable<T>介绍

IEnumerable 是 C# 中的一个接口,它是 .NET Framework 中的集合类型的基础。任何实现了 IEnumerable 接口的对象都可以进行 foreach 迭代。

IEnumerable 只有一个方法,即 GetEnumerator,该方法返回一个 IEnumerator 对象。IEnumerator 对象用于迭代集合,它提供了 MoveNext 方法(用于移动到集合的下一个元素),Current 属性(获取当前元素)和 Reset 方法(将枚举器设置回其初始位置,但这个方法通常不会被实现或使用)。

在大多数情况下,你不需要直接实现 IEnumerable 或 IEnumerator。相反,你可以使用 yield return 语句让编译器为你生成这些方法。

比如使用IEnumerable实现一个生成斐波那契数列,下面这个例子展示了如何实现一个这样的生成器:

csharp 复制代码
using System;
using System.Collections.Generic;

public class FibonacciGenerator : IEnumerable<long>
{
    private readonly int _count;

    public FibonacciGenerator(int count)
    {
        _count = count;
    }

    public IEnumerator<long> GetEnumerator()
    {
        long current = 1, previous = 0;
        for (int i = 0; i < _count; i++)
        {
            long temp = current;
            current = previous + current;
            previous = temp;
            yield return previous;
        }
    }

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

在上述代码中,FibonacciGenerator 类实现了 IEnumerable<long> 接口。GetEnumerator 方法是 IEnumerable<T> 接口的一部分,它返回一个 IEnumerator<T>,这个 IEnumerator<T> 会生成斐波那契数列。

当你创建一个 FibonacciGenerator 实例并开始遍历它时,GetEnumerator 方法会被调用,然后返回的 IEnumerator<long> 会被用来生成斐波那契数列的值。

例如,以下代码将打印前10个斐波那契数:

csharp 复制代码
foreach (var num in new FibonacciGenerator(10))
{
    Console.WriteLine(num);
}

这种方法的优势在于,它只在需要下一个斐波那契数时才计算它,而不是一次性计算所有的斐波那契数。这使得它能有效地处理大规模的数据。

相关推荐
Lost of 程序猿5 小时前
用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践
c#·asp.net
点纭8 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
用户788477316349 小时前
用 .NET MAUI 一套 C# 同时出 Windows 和 Android:哪些是真能共享,哪些是 marketing
c#
Lost of 程序猿10 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
林川~0120 小时前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
He BianGu1 天前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
tang_04271 天前
【Hi.Ltd 专题】第9期:Interop 配置互操作(JSON/INI/XML/YAML/注册表/扫码)
经验分享·c#·hi.ltd系列
tang_04271 天前
【Hi.Ltd 专题】第7期:Threading 采集线程、锁与 LRU 缓存
经验分享·c#·hi.ltd系列
A_nanda1 天前
C# 界面卡顿:从定位到根治
c#
2501_930707781 天前
使用C#代码为新创建的 Word 文档创建目录
c#·word