C#中IEnumerator<T>和IEnumerable的区别

 更新时间:2024年01月24日 16:32:36   作者:周杰伦fans  
在C#中,IEnumerator<T>和IEnumerable是用于实现迭代的接口,本文主要介绍了C#中IEnumerator<T>和IEnumerable的区别,具有一定的参考价值,感兴趣的可以了解一下

在 C# 中,IEnumerator<T> 和 IEnumerable 是用于实现迭代的接口。它们的区别在于它们的功能和使用方式。

IEnumerable 接口表示一个可枚举的集合,它定义了一个方法 GetEnumerator(),该方法返回一个实现了 IEnumerator 接口的对象。这意味着类型实现了 IEnumerable 接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。IEnumerable 接口是只读的,它只能支持前向迭代,不能修改集合中的元素。

IEnumerator<T> 接口是泛型版本的迭代器接口,它继承自 IEnumerator 接口,并增加了一个 Current 属性,用于获取集合中当前位置的元素。IEnumerator<T> 接口定义了以下方法和属性:

  • bool MoveNext():将迭代器移动到集合的下一个元素,如果成功移动到下一个元素则返回 true,否则返回 false
  • void Reset():将迭代器重置到集合的起始位置。
  • T Current:获取集合中当前位置的元素。

通过实现 IEnumerator<T> 接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。

下面是一个示例,演示了 IEnumerable 和 IEnumerator<T> 的用法和区别:

using System;
using System.Collections;
using System.Collections.Generic;

public class MyCollection<T> : IEnumerable<T>
{
    private List<T> items = new List<T>();

    public void Add(T item)
    {
        items.Add(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new MyEnumerator<T>(items);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MyEnumerator<T> : IEnumerator<T>
{
    private List<T> items;
    private int currentIndex = -1;

    public MyEnumerator(List<T> items)
    {
        this.items = items;
    }

    public bool MoveNext()
    {
        currentIndex++;
        return currentIndex < items.Count;
    }

    public void Reset()
    {
        currentIndex = -1;
    }

    public T Current
    {
        get { return items[currentIndex]; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }

    public void Dispose()
    {
        // 不需要实现
    }
}

public class Program
{
    public static void Main()
    {
        MyCollection<int> collection = new MyCollection<int>();
        collection.Add(1);
        collection.Add(2);
        collection.Add(3);

        // 使用 foreach 遍历集合
        Console.WriteLine("使用 foreach 遍历集合:");
        foreach (int item in collection)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        // 使用迭代器手动遍历集合
        Console.WriteLine("使用迭代器手动遍历集合:");
        IEnumerator<int> enumerator = collection.GetEnumerator();
        while (enumerator.MoveNext())
        {
            int item = enumerator.Current;
            Console.WriteLine(item);
        }
    }
}

在这个示例中,我们定义了一个名为 MyCollection<T> 的泛型集合类,它实现了 IEnumerable<T> 接口。在 MyCollection<T> 类中,我们使用 List<T> 存储集合中的元素,并实现了 GetEnumerator 方法,返回一个实现了 IEnumerator<T> 接口的迭代器。

我们还定义了一个名为 MyEnumerator<T> 的泛型迭代器类,它实现了 IEnumerator<T> 接口。在 MyEnumerator<T> 类中,我们使用一个索引 currentIndex 跟踪当前位置,并实现了 MoveNext 方法、Reset 方法和 Current 属性。

在 Main 方法中,我们创建了一个 MyCollection<int> 类型的集合实例,并向其中添加了几个元素。然后,我们使用 foreach 循环和迭代器手动遍历集合,并输出每个元素的值。

通过实现 IEnumerable<T> 和 IEnumerator<T> 接口,我们可以在 C# 中实现可迭代的集合,并使用foreach 循环或手动迭代器来访问集合中的元素。 IEnumerator<T> 提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。

到此这篇关于C#中IEnumerator<T>和IEnumerable的区别的文章就介绍到这了,更多相关C# IEnumerator<T> IEnumerable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# 删除所有的空文件夹的小例子

    c# 删除所有的空文件夹的小例子

    c# 删除所有的空文件夹的小例子,需要的朋友可以参考一下
    2013-03-03
  • Unity Undo实现原理和使用方法详解

    Unity Undo实现原理和使用方法详解

    本文将详细介绍Unity Undo实现原理和使用方法,并提供多个使用例子,帮助开发者更好地理解和应用该功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#事件处理和委托event delegate实例简述

    C#事件处理和委托event delegate实例简述

    这篇文章主要介绍了C#事件处理和委托event delegate的简单实例,较为详细的讲述了C#事件处理和委托的声明与实现过程,代码简单易懂,需要的朋友可以参考下
    2014-09-09
  • WinForm实现关闭按钮不可用或隐藏的方法

    WinForm实现关闭按钮不可用或隐藏的方法

    这篇文章主要介绍了WinForm实现关闭按钮不可用或隐藏的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • C#实现FTP传送文件的示例

    C#实现FTP传送文件的示例

    这篇文章主要介绍了C#实现FTP传送文件的示例,帮助大家更好的理解和学习c#的使用,感兴趣的朋友可以了解下
    2020-12-12
  • C#中值类型和引用类型的使用与比较

    C#中值类型和引用类型的使用与比较

    在C#中,数据类型分为值类型和引用类型两种,引用类型变量存储的是数据的引用,而值类型变量直接存储数据,下面小编就来和大家讲讲这二者的使用与区别吧
    2023-07-07
  • winform绑定快捷键的方法

    winform绑定快捷键的方法

    这篇文章主要介绍了winform绑定快捷键的方法,涉及WinForm设置窗体按键事件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 如何使用C#设置Excel单元格和工作表的背景

    如何使用C#设置Excel单元格和工作表的背景

    在Excel文档的设计与美化中,单元格和工作表的背景设置不仅能提升文档的可视化效果,还能增强数据呈现的逻辑性,下面我们就来看看如何使用C#设置Excel单元格和工作表背景吧
    2025-05-05
  • C#关机小程序源码

    C#关机小程序源码

    这是用所学习的C#做的一个关机小程序,功能不多,只是为了练手,需要的朋友可以参考下
    2012-10-10
  • C#中接口的显式实现与隐式实现及其相关应用案例详解

    C#中接口的显式实现与隐式实现及其相关应用案例详解

    最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”,增加实现接口的类访问方法的“成本”,这篇文章主要介绍了C#中接口的显式实现与隐式实现及其相关应用案例,需要的朋友可以参考下
    2024-05-05

最新评论