C#学习笔记--foreach循环是怎么遍历容器的?实战带你弄懂foreach原理

这篇具有很好参考价值的文章主要介绍了C#学习笔记--foreach循环是怎么遍历容器的?实战带你弄懂foreach原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上篇文章我们了解了IEnumerableIEnumeratorC#学习笔记–由浅至深理解IEnumerable和IEnumerator

这篇文章我们来研究foreach循环

foreach原理

foreach循环实际上是通过调用集合的GetEnumerator方法来获取一个枚举器,然后在每次迭代中调用枚举器的MoveNext方法来遍历集合的。当枚举器的MoveNext方法返回false时,表示集合中没有更多元素,循环结束。

也就是说,只要是实现了 IEnumerable 接口,都可以被 foreach 循环遍历。

实现自己的容器

那有了这个理论基础,我们赶紧来自己写一个小容器吧

例子一:数组容器

  1. 先定义一个类,实现IEnumerable接口
public class MyNumbers : IEnumerable<int>
{
    private int[] numbers = new int[] { 1, 2, 3 };

    public IEnumerator<int> GetEnumerator()
    {
        return null;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
  1. 定义该类的迭代器
public class MyNumbers : IEnumerable<int>
{
    private int[] numbers = new int[] { 1, 2, 3 };

    public IEnumerator<int> GetEnumerator()
    {
        return new MyEnumerator(numbers);
    }

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

public class MyEnumerator : IEnumerator<int>
{
    private int[] numbers;
    private int index = -1;

    public MyEnumerator(int[] numbers)
    {
        this.numbers = numbers;
    }

    public int Current
    {
        get
        {
            return numbers[index];
        }
    }

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

    public bool MoveNext()
    {
        index++;
        return index < numbers.Length;
    }

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

    public void Dispose()
    {
        // No resources to dispose
    }
}

在这个例子中,我们创建了两个类:MyNumbersMyEnumerator
MyNumbers类实现了IEnumerable< int >接口,它定义了一个GetEnumerator方法,该方法返回一个实现了IEnumerator< int >接口的对象。
MyEnumerator类实现了IEnumerator< int >接口,它定义了用于遍历序列的方法,例如MoveNextCurrent

我们可以使用下面的代码来遍历这个自定义的迭代器类:

MyNumbers myNumbers = new MyNumbers();
foreach (int number in myNumbers)
{
    Console.WriteLine(number);
}

例子二:Student类

  1. 先定义一个Student类,实现IEnumerable接口
public class Student : IEnumerable
{
    private int id;
    private int age;
    private string name;

    public Student(int id_in, int age_in, string name_in)
    {
        id = id_in;
        age = age_in;
        name = name_in;
    }

    public IEnumerator GetEnumerator()
    {
        return null;
    }
}
  1. 定义该类的迭代器
public class Student : IEnumerable
{
    private int id;
    private int age;
    private string name;

    public Student(int id_in, int age_in, string name_in)
    {
        id = id_in;
        age = age_in;
        name = name_in;
    }

    public IEnumerator GetEnumerator()
    {
        return new StudentEnumerator(this);
    }

    private class StudentEnumerator : IEnumerator
    {
        private Student student;
        private int index = -1;

        public StudentEnumerator(Student student)
        {
            this.student = student;
        }

        public object Current
        {
            get
            {
                switch (index)
                {
                    case 0:
                        return student.id;
                    case 1:
                        return student.age;
                    case 2:
                        return student.name;
                    default:
                        throw new InvalidOperationException();
                }
            }
        }

        public bool MoveNext()
        {
            index++;
            return index < 3;
        }

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

在这个例子中,我们创建了两个类:StudentStudentEnumerator
Student 类实现了 IEnumerable 接口,它定义了一个返回 IEnumerator 对象的 GetEnumerator 方法。
StudentEnumerator 类实现了 IEnumerator 接口,它定义了用于遍历序列的方法,例如 MoveNextCurrent

现在,我们可以使用 foreach 循环来遍历 Student 类的实例了。例如:文章来源地址https://www.toymoban.com/news/detail-438174.html

Student student = new Student(1, 18, "Alice");
foreach (var item in student)
{
    Console.WriteLine(item);
}

到了这里,关于C#学习笔记--foreach循环是怎么遍历容器的?实战带你弄懂foreach原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【笔记】Java中for循环遍历删除操作

    在Java中,有些场景需要遍历集合中的元素,然后根据条件进行删除元素的操作。如果使用传统的for循环遍历方式来删除元素,很可能出错或发生意想不到的问题。推荐使用 迭代器iterator 完成 1. 推荐使用 迭代器方式****删除 阿里规约:【强制】不要在 foreach 循环里进行元素的

    2024年02月11日
    浏览(44)
  • 遍历用for还是foreach?

    遍历用for还是foreach?这篇文章帮你轻松选择! 在编程的世界里,我们经常需要对数据进行循环处理,常用的两种方法就是:for循环和foreach循环。想象你站在一条装满宝贝的传送带前,你要亲手检查每一件宝贝。使用for循环就像是你亲手控制传送带的速度和方向,而使用for

    2024年02月19日
    浏览(41)
  • 学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战

    19.5.4 利用ADC第15通道(内部1.19V参考信号源)测量外部电压或电池电压 注意:这里的1.19V不是ADC 的基准电压ADC-Vref+,而是ADC15通道的固定输入信号源,1.19V STC32G系列ADC的第15通道用于测量内部参考信号源,由于内部参考信号源很稳定,约为1.19V,且不会随芯片的工作电压的改变而变化

    2024年02月07日
    浏览(49)
  • JavaScript forEach 方法跳出循环

    这个问题平时工作中基本不会遇到,通常是面试时,有的面试官喜欢问这个,所以有了探讨的意义。 首先我们来看看 for 循环是怎么处理跳出的。 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环 break:结束循环 了解了 for 循环跳出之后,forEach 如何

    2024年02月03日
    浏览(40)
  • foreach循环使用方法详解

    在前面的文章中, 千锋壹哥 给大家讲解了for、while、do-while三种循环结构,并讲解了如何跳出循环的几种方式,比如break、continue、return等。但是截止到目前,与循环相关的内容还没有完事,我们还有最后一哆嗦,今天 千锋壹哥 会给大家讲解另一种循环方式--增强for循环!这

    2023年04月24日
    浏览(45)
  • Java循环对比:传统for循环、增强型for循环和forEach循环

    传统的for循环是一种经典的循环结构,在Java中广泛使用。 以下是传统for循环的特点: 灵活控制:传统for循环使用形式为for (初始化表达式; 终止条件; 步进表达式)的语法,可以手动控制循环的索引,并根据需要执行自定义操作。 索引访问:传统for循环通过索引访问集合或数

    2024年02月07日
    浏览(40)
  • HarmonyOS-ForEach:循环渲染

    ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如,ListItem组件要求ForEach的父容器组件必须为List组件。 说明 从API version 9开始,该接口支持在ArkTS卡片中使用。 参数名 参数类型 必

    2024年01月25日
    浏览(36)
  • Kotlin基础入门 - for、forEach 循环

    不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式 基础 for循环 for循环 一般作用于 list、map数据集合 ,这里我直接创建了一个只读List集合 提前了解 惯性 for循环 所谓的惯性

    2024年01月16日
    浏览(40)
  • kotlin forEach循环return/break

    kotlin forEach循环return/break   [0, 1, 2] [0, 1, 2, 3]     kotlin forEachIndexed arrayListOf<String>_zhangphil的博客-CSDN博客 Python for循环中的zip_python zip函数用于for循环_zhangphil的博客-CSDN博客。 https://blog.csdn.net/zhangphil/article/details/131003571  

    2024年02月16日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包