C# Unity 面向对象补全计划 之 索引器与迭代器

news/2025/3/6 16:53:11/

         本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

        本篇有部分内容出自唐老狮,唐老师网站指路:全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho

目录

1.索引器

 2.迭代器


1.索引器

        我的理解 索引器就是一个对象内数据结构属性, 像普通属性一样是一个语法糖

       可以让 对象 像数组一样访问 对象内的集合元素 看一下就知道怎么用了

        来一个C#版本的看看语法

public class StudentList
{private string[] students = new string[5];// 定义索引器 其中index代表外界索引的标志 返回值则是你的数据结构的类型public string this[int index]{get => students[index];set => students[index] = value;}
}// 使用索引器
StudentList list = new StudentList();
list[0] = "Alice";  // 设置值
Console.WriteLine(list[0]); // 输出 "Alice"(获取值)

        要知道索引器不仅可以封装对象数组 还可以封装List 字典等等 

        来一个Unity版本的:

        C#下 泛型的 ,其实上面那个就是Unity 泛型的

public class CustomListWrapper<T>
{private List<T> _items = new List<T>();// 索引器public T this[int index]{get => _items[index];set => _items[index] = value;}// 添加元素的方法public void Add(T item) => _items.Add(item);
}// 使用
var listWrapper = new CustomListWrapper<string>();
listWrapper.Add("A");
listWrapper[0] = "B";  // 通过索引器修改值
Console.WriteLine(listWrapper[0]); // 输出 "B"

 2.迭代器

        允许对象支持 foreach 遍历 就已经实现了迭代器 作用为按需生成序列值(延迟执行),不需要知道其内部逻辑结构

        foreach的本质就是利用迭代器做迭代 ,借用唐老狮笔记:

        自己写迭代器 只需要注意三点:

        1 继承IEnumerator(可选)

        2 实现GetEnumerator(必须)

        3 继承IEnumerator(必须)

        其内部就是一个可移动的"光标",每次MoveNext以后返回为true就让currentIndex+=1

using System;
using System.Collections;class MyCollection
{private int[] data = { 1, 2, 3, 4, 5 };public MyEnumerator GetEnumerator(){return new MyEnumerator(this);}public class MyEnumerator : IEnumerator{private MyCollection collection;private int currentIndex = -1;public MyEnumerator(MyCollection collection){this.collection = collection;}public object Current{get{if (currentIndex < 0 || currentIndex >= collection.data.Length){throw new InvalidOperationException();}return collection.data[currentIndex];}}public bool MoveNext(){currentIndex++;return currentIndex < collection.data.Length;}public void Reset(){currentIndex = -1;}public void Dispose(){// 在这里进行资源清理相关操作,比如关闭文件、释放连接等// 对于简单示例这里可以不做具体操作}}
}class Program
{static void Main(){MyCollection myCollection = new MyCollection();MyCollection.MyEnumerator enumerator = myCollection.GetEnumerator();while (enumerator.MoveNext()){Console.WriteLine(enumerator.Current);}enumerator.Dispose();}
}

        使用yield return直接替代了IEnumerator中这几个方法

using System;
using System.Collections.Generic;class MyEnumerable
{private int[] data = { 1, 2, 3, 4, 5 };public IEnumerable<int> GetEnumerator(){for (int i = 0; i < data.Length; i++){yield return data[i];}}
}class Program
{static void Main(){MyEnumerable myEnumerable = new MyEnumerable();foreach (int num in myEnumerable.GetEnumerator()){Console.WriteLine(num);}}
}

         总体来说 是不需要自己实现但是需要知道的知识

 


http://www.ppmy.cn/news/1577114.html

相关文章

ElasticSearch 在半导体工厂中的智能应用与 AI 联动

您是否曾想过如何将 ElasticSearch 这一强大的搜索和分析引擎应用于半导体工厂的智能生产中&#xff1f;本文将为您揭示 ElasticSearch 在半导体行业的应用场景、与 AI 和向量数据库的结合方式&#xff0c;以及与开源 AI&#xff08;如 DeepSeek&#xff09;的联动方法&#xf…

突破传统:用Polars解锁ICU医疗数据分析新范式

一、ICU数据革命的临界点 在重症监护室&#xff08;ICU&#xff09;&#xff0c;每秒都在产生关乎生死的关键数据&#xff1a;从持续监测的生命体征到高频更新的实验室指标&#xff0c;从呼吸机参数到血管活性药物剂量&#xff0c;现代ICU每天产生的数据量级已突破TB级别。传统…

《基于 LIME 的低照度图像处理》开题报告

目录 一、研究目的和意义 1.研究目的 2.研究意义 二、国内外研究现状和发展趋势 三、研究内容、研究方法及可行性分析 1、研究内容 2、研究方法 3、可行性分析 四、项目特色与创新点 1、面向特定应用场景的针对性研究 1.多算法比较与选择的严谨性 2.基于硬件平台的深…

C++编程指南22 - 在线程之间传递少量数据时,使用值传递,而不是引用或指针传递

一&#xff1a;概述 传递少量数据时&#xff0c;复制比通过某些锁机制共享数据更便宜。复制数据自然会导致唯一所有权&#xff08;简化代码&#xff09;&#xff0c;并消除了数据竞争的可能性。注意&#xff1a;“少量数据”的定义是无法精确界定的。 二&#xff1a;示例 st…

Leetcode 57-插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

1、语言的本质

语言的本质 1.1 语言的产生生物重演律 1.2 语言的本质1.3 语系1.4 文字的起源汉字的构成和使用 后记 语言是人类传递信息的工具&#xff0c;其本质是信息的载体。 语音和文字是构成语言的两个基本属性&#xff0c;语音是语言承载的物理信号&#xff0c;文字是记录语言的逻辑符…

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…

alloc、malloc 与 allocator:内存管理三剑客

内存管理是C语言开发者的核心能力&#xff0c;也是系统级编程的基石。 一、内存分配三剑客&#xff1a;malloc/calloc/realloc 1. malloc函数原理 int* arr (int*)malloc(5 * sizeof(int)); // 分配20字节空间&#xff08;假设int为4字节&#xff09; 从堆区分配指定字节的连…