C#学习日记29—-二维索引器 与 foreach遍历索引器

上一篇结尾的时候我留下了几个问题,因为要断电了没有解决,这一篇我们继续上一篇的内容。点这里回到上一篇

问题1:

        数组有多维度的,索引器也可以是多维的吗???

         索引器可以是多维的,上一篇中我们定义的索引器只是一维索引器,同数组一样可以定义多维索引器。比如我们索引电影院的一个放映室的座位号,第一排第一列为1号,一排2列为2号……如下:

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;    namespace Test1  {//定义cinema类包含一个二维数组与一个二维访问器      class cinema      {//定义一个二维数组          private string[,] seat = new string[5, 5];      //定义一个二维访问器          public string this[uint a, uint b]          {              get { return seat[a, b]; }              set { seat[a, b] = value; }                    }            }      class Program      {          static void Main(string[] args)          {              cinema movieroom = new cinema();//实例化              //for循环遍历写入              for (uint i = 1; i < 5; i++)              {                  for (uint j = 1; j < 5; j++)                  {                      movieroom[i, j] = "第" + i + "排 第" + j + "列";                  }              }              //for循环遍历读出              for (uint i = 1; i < 5; i++)              {                  for (uint j = 1; j < 5; j++)                  {                      Console.WriteLine(movieroom[i,j]+"t"+((i-1)*4+j)+"号");                                                 }                            }          }      }  }

结果:

662.png

二维的索引器就是如此了,其他多维数的都以此类推,就不介绍了。

 

问题2:

        数组能够使用foreach语句进行简单快捷的遍历,索引器也能使用foreach语句遍历么???

          这个也是可以的,在解决这个问题的时候有必要弄清楚foreach的执行步骤与原理.

foreach语句:

       C#中编译器会把foreach语句转化为IEnumerable接口的方法和属性,比如:

string[] str = new string[] { "HC1", "HC2", "HC3", "HC4" };//定义一个数组              foreach (string i in str)//使用foreach遍历              {                  Console.WriteLine(i);              }

    然而foreach语句会被解析为下面的代码段。  

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Collections; //注意添加这个命名空间,否则没有IEnumerator这个类    namespace Example  {      class Program      {          static void Main(string[] args)          {              string[] str = new string[] {"HC1","HC2","HC3","HC4" }; //定义一个数组            //调用GetEnumerator()方法,获得数组的一个枚举              IEnumerator per = str.GetEnumerator();            //在while循环中,只要MoveNext()返回true,就一直循环下去              while (per.MoveNext())              {                  //用Current属性访问数组中的元素                  string p = (string)per.Current;                  Console.WriteLine(p);              }          }      }  }

结果都一样:

663.png

我们对string查看定义发现,string继承于IEnumerable接口,IEnumerable接口中只有一个方法GetEnumerator();(该方法已在string类中被实现了)该方法的作用是,返回一个循环访问集合的枚举器IEnumerator,我们在转IEnumerator的定义,它也是一个接口,里面只有三个方法的声明,Current(获取集合中的当前元素),MoveNext(将枚举数推进到集合的下一个元素,成功返回true,越过结尾返回false),Reset( 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前),也就是说,如果在我们自定义的类中没有实现GetEnumerator方法,以及Current、MoveNext方法,就不能使用foreach语句遍历了。

 

foreach语句遍历自定义类:

         还是上面电影院的例子,不过这次我们不用for循环输出,而是实现foreach语句遍历输出,如下:

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Collections; //添加这个很有必要    namespace Test1  {//定义cinema继承IEnumerable接口实现GetEnumerator()功能      class cinema:IEnumerable      {//定义一个二维数组          private string[,] seat = new string[5, 5];        //定义座位号码          static public int index=-1;      //定义一个二维索引器          public string this[uint a, uint b]          {              get { return seat[a, b]; }              set { seat[a, b] = value; }//set访问器自带value参数                    }          //实现GetEnumerator方法          public IEnumerator GetEnumerator()          {              return new ienumerator(seat); //利用构造方法传入seat参数          }          //由于上面返回值的需要所以继承接口IEnumerator并实现方法         private class ienumerator:IEnumerator          {              private string[,] seats; //将传入的seat数组赋给它              public ienumerator(string[,] s)              {                  seats = s;               }             //定义Current的只读属性              public object Current              {  //根据座位号推算数组的坐标也就是物理位置                 get { return seats[1+(index/4), (index%4)+1]; }                            }             //定义向下移动的规则              public bool MoveNext()              {                  index++; //索引下一个座位号的位置                  if (index <= 15)                  {                      return true;                  }                  else                      return false;                            }             //因为这个程序中用不到这个方法所以不实现,但是必须得写上否则会报错              public void Reset()              {                                         }                    }            }      class Program      {          static void Main(string[] args)          {              cinema movieroom = new cinema();//实例化              //for循环索引写入              for (uint i = 1; i < 5; i++)              {                  for (uint j = 1; j < 5; j++)                  {                      movieroom[i, j] = "第" + i + "排 第" + j + "列";                  }              }          //调用foreach语句遍历输出              foreach (string i in movieroom)              {                  Console.WriteLine(i+"t"+(cinema.index+1)+"号");                                }          }      }  }

结果:

664.png

 结果是一样的。。。。

以上就是 C#学习日记29—-二维索引器foreach遍历索引器的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C#学习日记20—-static静态变量 与 常量
上一篇 2025年12月17日 06:04:08
C#学习日记28—索引器、重载索引器
下一篇 2025年12月17日 06:05:31

相关推荐

  • win8系统无法安装软件怎么解决_win8软件安装失败的修复方法

    win8系统无法安装软件怎么解决_win8软件安装失败的修复方法win8系统无法安装软件怎么解决_win8软件安装失败的修复方法win8系统无法安装软件怎么解决_win8软件安装失败的修复方法win8系统无法安装软件怎么解决_win8软件安装失败的修复方法

    win8系统安装软件失败,通常由权限、兼容性或系统服务问题导致。首先,右键点击安装程序,选择“以管理员身份运行”解决权限不足问题;其次,尝试以兼容模式运行安装程序,如#%#$#%@%@%$#%$#%#%#$%@_0f4137ed1502b5045d6083aa258b5c++42 7模式;第三,检查…

    2026年9月5日 用户投稿
    300
  • JNA调用C++ DLL时出现异常,如何避免JVM崩溃?

    JNA调用C DLL异常处理及JVM崩溃避免策略 使用JNA调用C DLL时,DLL内部抛出的异常可能导致JVM崩溃。这是因为JNA依赖JNI,而JNI在异常处理方面缺乏对C++异常的直接捕获机制。 Java端无法捕获C++异常,导致JVM将此视为未处理异常并终止进程。 Java端无法捕获C++异常…

    2026年9月5日
    000
  • Claude和ChatGPT有什么区别_Claude与ChatGPT功能对比分析

    Claude在长文本处理和复杂指令遵循上具有显著优势,主要得益于其超大上下文窗口(可达20万token)和“宪法式AI”训练机制。这使得它能同时处理大量文本信息,在法律合同分析、技术文档总结、代码库审查等场景中表现优异。其强大的上下文记忆能力确保了长时间多轮对话的连贯性,不易“失忆”或跑题。同时,宪…

    2026年9月5日
    100
  • 谷歌电脑进化史下载指南_资源获取方式与途径

    下载谷歌电脑进化史资源的核心在于分步挖掘可靠源头并选择合适方法获取,1.优先从谷歌官方博客、github开源平台、学术数据库及互联网档案馆等权威渠道查找第一手资料;2.根据资源类型采取对应下载方式,代码通过github克隆,文档下载pdf,软件寻找官方安装包;3.使用虚拟机或模拟器解决旧软件兼容问题…

    2026年9月4日
    100
  • [C++]在windows基于C++编程署yolov8的openvino目标检测模型cmake项目部演示源码

    在#%#$#%@%@%$#%$#%#%#$%@_0f4137ed1502b5045d6083aa258b5c++42平台上,利用c++结合openvino部署yolov8目标检测模型,可以通过cmake构建项目实现高效推理。yolov8作为yolo系列的较新版本,在检测精度与推理速度方面均有显著提升…

    2026年9月4日
    100
  • Java远程调试(Remote Debugging)的那些事

    前言本文将探讨如何处理和调试那些仅在生产环境(或其他远程环境)中发生,而本地开发环境无法重现的“问题”。任何遇到这种情况的人都必须承认,试图找出这种“问题”原因的过程,很可能以一堆无根据的猜测告终:这是一个非常耗时且效率低下的过程。 还有一种情况,你得到了一个可以部署的war/jar包,只有clas…

    2026年9月4日
    100
  • .NET Framework怎么下载安装 图文详解

    .NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解.NET Framework怎么下载安装 图文详解

    在现代windows操作系统中,不少应用程序依然需要 .net framework 才能正常运行,尤其是一些虽然年代较久但仍被大量使用的软件。本文将全面介绍如何下载并安装 .net framework,帮助用户快速获取所需组件。 一、.NET Framework 简介 .NET Framework …

    2026年9月4日 用户投稿
    900
  • C++中如何实现私有函数仅供特定公有函数调用?

    C++:限制私有函数的访问权限 如何确保C++中的私有成员函数只能被特定的公有成员函数访问,而其他函数无法直接调用? 在C++中,这可以通过巧妙地利用类的成员函数和作用域来实现。 私有成员函数本身就具有私有访问权限,这意味着只有类内部的成员函数才能访问它。 要实现“特定公有函数”的访问限制,我们不需…

    2026年9月4日
    000
  • C++中如何用Lambda函数实现私有函数仅供公有函数调用?

    C++中使用Lambda函数模拟私有函数,仅供公有函数调用 问题:如何在C++中实现类似于其他语言中“私有函数仅供公有函数调用”的特性? 解决方法:虽然C++没有直接的“私有函数”概念像Java或C#那样,但我们可以巧妙地利用Lambda表达式来模拟这种行为。Lambda表达式创建的匿名函数,其作用…

    2026年9月4日
    100
  • ​​无法定位程序输入点于动态链接库?错误修复指南​​

    重新安装或修复出错程序,确保安装完整且无残留;2. 运行sfc++ /scannow和dism命令修复系统文件,必要时手动替换受损dll;3. 更新或重装microsoft visual c++ redistributable和.net framework等运行库;4. 更新驱动程序和系统补丁,确保…

    2026年9月4日
    400
  • C#——获取鼠标当前坐标

    c#中坐标转换的详细说明与示例: 在C#编程中,坐标转换是常见的操作,尤其是在处理用户界面时。以下是关于坐标转换的一些关键方法及其使用说明: Control.PointToScreen:将控件上的点转换为屏幕坐标系中的点。例如,如果你有一个控件上的点,需要知道它在整个屏幕上的位置,可以使用此方法。 …

    2026年9月4日
    300
  • Linux文件系统目录结构详解

    大家好,又见面了,我是你们的朋友全栈君。 引言 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解#%#$#%@%@%$#%$#%#%#$%@_e206a54e97690c++e50cc872dd70ee896文件目录结构的标准和每个目录的…

    2026年9月4日
    200
  • 这次简单多了,最新版 MongoDB 安装

    这次简单多了,最新版 MongoDB 安装这次简单多了,最新版 MongoDB 安装这次简单多了,最新版 MongoDB 安装这次简单多了,最新版 MongoDB 安装

    在 windows 10 系统上安装 mongodb 4.0.1 版本变得更为简便,基本上一路点击“下一步”就能完成安装,不再需要繁琐的配置。 首先,访问 MongoDB 官方网站,下载 MongoDB 4.0.1 版本,网址如下: https://www.php.cn/link/9cba84644…

    2026年9月4日 用户投稿
    300
  • [python]windows上安装pyaudio最简单方法

    pyaudio是一个用于处理音频流的python库,它依赖于portaudio库。如果直接使用pip命令无法安装pyaudio,可以尝试通过whl文件进行安装。以下是pyaudio通过whl文件安装的详细方法: 一、准备阶段 下载PyAudio的whl文件 访问可靠的Python包分发网站,如镜像站…

    2026年9月3日
    100
  • 如何批量读取CAD文件中右下角的角标数据(例如图号和工程名)?

    高效提取CAD图纸角标信息 本文介绍如何批量提取CAD文件(例如DXF或DWG格式)右下角的角标数据,如图号和工程名,从而简化项目文件管理。 Python程序员可以使用其强大的文本处理能力来实现此功能。 实现方法包括: 了解文件格式: 首先,需要熟悉CAD文件(DXF或DWG)的格式规范,理解其数据…

    2026年9月3日
    300
  • 认识基本的mfc控件

    在#%#$#%@%@%$#%$#%#%#$%@_0f4137ed1502b5045d6083aa258b5c++42程序中,常见的界面元素包括按钮、复选框、文本框和下拉列表等,这些元素被称为控件。许多常用的控件已被集成到操作系统中,在visual c++中,这些控件的使用简便到可以直接通过“拖放”方…

    2026年9月3日
    100
  • malloc 函数详解

    malloc 函数详解malloc 函数详解malloc 函数详解malloc 函数详解

    大家好,又见面了,我是你们的朋友全栈君。 很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的。但是但是: 一部分人还是将:malloc当作系统所提供的或者是C的关键字,事实上:malloc只是C标准库中提供的一…

    2026年9月3日 用户投稿
    400
  • 找不到ucrtbased.dll怎么办 总结4个修复方法

    找不到ucrtbased.dll怎么办 总结4个修复方法找不到ucrtbased.dll怎么办 总结4个修复方法找不到ucrtbased.dll怎么办 总结4个修复方法找不到ucrtbased.dll怎么办 总结4个修复方法

    使用#%#$#%@%@%$#%$#%#%#$%@_e855972ea937e3ffc++6bd147da9a030da时,你可能会碰到“缺少ucrtbased.dll文件,无法继续执行代码”的提示。这个dll文件属于microsoft visual c++运行库的调试组件,常见于开发环境。若系统未安…

    2026年9月3日 用户投稿
    200
  • Yandex 开发并开源 Perforator,这款开源工具每年可为企业节省数十亿美元的服务器基础设施成本

    全球领先的科技公司 yandex 开发并开源了 perforator,这是一款用于对服务器和应用程序进行持续实时监控和分析的创新工具。 Perforator 帮助开发人员识别最占资源的代码部分,并提供详细的统计数据,以便进行后续优化。通过识别代码中的低效部分并支持基于配置文件的优化,Perforat…

    2026年9月3日
    100
  • C++ STL map使用指南

    C++ STL map使用指南C++ STL map使用指南C++ STL map使用指南C++ STL map使用指南

    stl是standard template library的缩写,意为标准模板库,是c++++语言中极为关键的一部分。 1、 map容器采用红黑树结构实现,以键值对的形式保存数据,能够高效地完成从key到value的映射与检索操作。 2、 图片来源于网络 3、 函数声明格式如下: 4、 声明一个名为…

    2026年9月2日 用户投稿
    100

发表回复

登录后才能评论
关注微信