首页 > 其他分享 >IEnumrable接口 GetEnumerator方法 foreach 遍历 自定义 迭代器

IEnumrable接口 GetEnumerator方法 foreach 遍历 自定义 迭代器

时间:2024-08-28 19:25:24浏览次数:8  
标签:自定义 GetEnumerator IEnumerable MyCollection 接口 IEnumrable foreach 方法

** 能用 foreach 遍历访问的对象需要实现 什么 接口或声明 什么 方法**

要使用 foreach 循环,对象必须实现 I Enumerable 接口或者声明 Get Enumerator 方法。

解释

  1. IEnumerable 接口:这个接口定义了一个名为 GetEnumerator 的方法,该方法返回一个枚举器,允许客户端代码逐个访问集合中的元素。

  2. GetEnumerator 方法:这是 IEnumerable 接口中定义的方法。实现 IEnumerable 接口的类必须提供这个方法。此外,如果你不想实现整个 IEnumerable 接口,也可以直接在你的类中声明 GetEnumerator 方法,但通常这样做不如实现 IEnumerable 接口常见。

代码示例

实现 IEnumerable 接口

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

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

    public MyCollection()
    {
        for (int i = 0; i < 5; i++)
        {
            items.Add(i);
        }
    }

    public IEnumerator GetEnumerator()
    {
        return items.GetEnumerator();
    }
}

class Program
{
    static void Main(string[] args)
    {

        MyCollection collection = new MyCollection();

        // 使用 foreach 遍历 MyCollection
        foreach (var item in collection)
        {
            Console.WriteLine(item);
        }
    }
}

在这个例子中,MyCollection 类实现了 IEnumerable 接口,并提供了 GetEnumerator 方法,使得我们可以在 Main 方法中使用 foreach 循环来遍历 MyCollection 对象。

声明 GetEnumerator 方法

虽然较少见,但在某些情况下,你可以直接声明 GetEnumerator 方法,而不是实现整个 IEnumerable 接口。这可以通过显式实现 IEnumerable.GetEnumerator 方法来完成,但通常这种方式不推荐使用,因为这样会使得调用者无法直接通过对象调用 GetEnumerator 方法。

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

public class MyCollection
{
    private List<int> items = new List<int>();

    public MyCollection()
    {
        for (int i = 0; i < 5; i++)
        {
            items.Add(i);
        }
    }

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

class Program
{
    static void Main(string[] args)
    {
        MyCollection collection = new MyCollection();

        // 使用 foreach 遍历 MyCollection
        foreach (var item in collection)
        {
            Console.WriteLine(item);
        }
    }
}

在这个例子中,MyCollection 类没有实现 IEnumerable 接口,而是显式实现了 IEnumerable.GetEnumerator 方法。尽管如此,由于 GetEnumerator 方法的存在,我们仍然可以使用 foreach 循环来遍历 MyCollection 对象。

总结

  • 实现 IEnumerable 接口是最常见的做法,它确保了 GetEnumerator 方法的可用性。
  • 直接声明 GetEnumerator 方法也可以支持 foreach 循环,但这不是最佳实践。

标签:自定义,GetEnumerator,IEnumerable,MyCollection,接口,IEnumrable,foreach,方法
From: https://www.cnblogs.com/zhuoss/p/18385421

相关文章

  • CI3自定义类库,并传参
    1、创建类文件 2、构造函数中使用数组形参,接收传递参数classHehe{//------------------------------------------------------------------------publicfunction__construct($config=array()){p($config);}//-------------------------------......
  • CAS server如何自定义Controller控制器
    CASserver如何自定义Controller控制器在实际开发过程中,CASServer4.0.0服务端提供了登录、认证等功能,但是我们希望加入更多的自定义功能,如自定义第三方登录服务等功能。增加一个Controller类控制器以及修改部分配置来完成CASServer4.0.0自定义Controller扩展,废话就不多说了,......
  • vxe-grid expandContent自定义展开的高度,以及展开的内容不要多于父vxe-grid会出现水平
    1、先上一张图,展示下效果:VxeTablev4.6默认是自适应高度的,也就是说我们只要指定展开的内容的最小高度就可以了。这样就可以保证展开的高度不会来回切换,并且我们可以限制容器里的内容的高度来实现。<stylelang="less"scoped>.sub-table{min-height:350px;......
  • linux中,解决使用sudo时,自定义path路径不生效的问题
    问题当我们在非root用户下,需要使用root权限的时候,通常在前面加sudo就可以了但是,今天遇到了一个小问题,就是我明明已经配置了go的bin目录在PATH变量中,还是配置在/etc/profile中,在root用户下,是可以执行go命令的按理说,用sudogo应该也是没问题的但是,我发现,当我......
  • CAS5和CAS6自定义异常提示消息
    CAS5和CAS6自定义异常提示消息使用cas登录时,如果登录错误页面应该提示一下错误消息,cas自带的有一些,不适用的话就需要自定义自己的异常消息提示了。自定义异常提示消息自定义异常消息类例如:验证码异常消息类importjavax.security.auth.login.AccountExpiredException;......
  • 【C#】【Winform】自定义控件、自定义事件
    https://blog.csdn.net/m0_62366581/article/details/139553373在开发桌面的过程中,有时候自带的控件样式或者功能上可能不一定能够满足我们的所有要求。这时候,我们需要自定义控件。创建类库项目把图标拖放到资源文件中添加用户控件设置样式尺寸修改代码视图其他项目中复用......
  • vue3 自定义hooks(组合式函数)
    什么是hooks自定义hooks是Vue3组合式函数的别称。在Vue应用的概念中,“组合式函数”(Composables)是一个利用Vue的组合式API来封装和复用有状态逻辑的函数。命名规范组合式函数约定用驼峰命名法命名,并以“use”作为开头。以便识别它们是可复用的逻辑单元。例如,u......
  • 使用 Tampermonkey5.1.1_0加自定义编写的js脚本实现自动填充表单
    最近有碰到要使用单点登录的需求,最开始是按照固定流程使用OAuth2.0或者jwt等技术通过父子系统交互的方式实现单点登录。缺点:代码繁琐,而且需要子系统配合提供单点登录接口,并且跳转时子系统需要携带其token等参数优点:安全,通过系统交互的方式鉴权访问接口。由于要集成的子系统很多,而......
  • quill-editor 富文本 组件封装并实现自定义上传图片
    基于quill-editor封装一个富文本组件,并实现自定义上传图片以及视频1.下载quill-editor npminstallvue-quill-editor--save2.对插件进行自定义改造(自定义字体大小选择,自定义标题,以及自定义工具栏功能) <template><divclass="edtior-box"><quill-editor......
  • WPF 自定义路由事件的实现
    路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数;通过RaiseEvent方法来触发事件;通过传统的CLR事件来封装后供用户使用。如何实现自定义路由事件,可以参考MSDN官网上的文档:如何:创建自定义路由事件下面的这个......