当前位置: 首页 > news >正文

C# 数组(foreach语句)

foreach语句

foreach语句允许我们连续访问数组中的每一个元素。其实它是一个比较通用的结构,可以
和其他集合类型一起使用——但是本节只会讨论它和数组的使用。

有关foreach语句的重点如下所示。

  • 迭代变量是临时的,并且和数组中元素的类型相同。foreach语句使用迭代变量来相继表
    示数组中的每一个元素。
  • foreach语句的语法如下,其中
    • Type是数组中元素的类型。我们可以显式提供它的类型,也可以使用va让其成为隐
      式类型并通过编译器来推断,因为编译器知道数组的类型。
    • ldentifier是迭代变量的名字。
    • ArrayName是要处理的数组的名字。
    • Satement是要为数组中的每一个元素执行一次的单条语句或语句块。

image

在之后的内容中,有时会使用隐式类型,而有时又会使用显式类型,这样我们就可以看到使
用的确切类型,但是两种形式的语法是等价的。
foreach语句以如下方式工作。

  • 从数组的第一个元素开始并把它赋值给迭代变量。
  • 然后执行语句主体。在主体中,我们可以把迭代变量作为数组元素的只读别名。
  • 在主体执行之后,foreach语句选择数组中的下一个元素并重复处理。
    这样,它就循环遍历了数组,允许我们逐个访问每一个元素。例如,如下代码演示了foreach
    语句和一个具有4个整数的一维数组的使用。
  • foreach语句的主体WriteLine语句为数组的每一个元素执行一次。
  • 第一次遍历时,迭代变量item就有了数组中第一个元素的值。相继执行后,它就有了数
    组中下一个元素的值。

image

迭代变量是只读的

由于迭代变量的值是只读的,所以它不能改变。但是,这对于值类型数组和引用类型数组而
言效果不一样。
对于值类型数组,这意味着在用迭代变量表示数组元素的时候,我们不能改变它们。例如,
在如下的代码中,尝试改变迭代变量中的数据产生了编译时错误消息:

image
对于引用类型数组,我们仍然不能改变迭代变量,但是迭代变量只是保存了数据的引用,而
不是数据本身。因此,虽不能改变引用,但我们可以通过迭代变量改变数据。
如下代码创建了一个有4个MyClass对象的数组并将其初始化。在第一个foreach语句中,
改变了每一个对象中的数据。在第二个foreach语句中,从对象读取改变后的值。

class MyClass{public int MyField=0;
}class Program{static void Main(){MyClass[] mcArray=new MyClass[4];    //创建数组for(int i=0;i<4;i++){mcArray[i]=new MyClass();        //创建类对象mcArray[i].MyField=i;            //设置字段}foreach(MyClass item in mcArray)item.MyField+=10;                //改变数据foreach(MyClass item in mcArray)Console.WriteLine($"{item.MyField}");//读取改变的数据}
}

foreach语句和多维数组

在多维数组中,元素的处理次序是最右边的索引号最先递增。当索引从0到长度减1时,开
始递增它左边的索引,右边的索引被重置成0。

矩形数组的示例

如下代码演示了将foreach语句用于矩形数组:

class Program
{static void Main(){int total=0;int[,] arr1={{10,11},{12,13}}foreach(var element in arr1){total+=element;Console.WriteLine($"Element:{element},Current Total:{total}");}}
}

交错数组的示例

交错数组是数组的数组,所以我们必须为交错数组中的每一个维度使用独立的foreach语句。
foreach语句必须嵌套以确保每一个嵌套数组都被正确处理。
例如,在如下代码中,第一个foreach语句遍历了顶层数组(arr1),选择了下一个要处理
的子数组。内部的foreach语句处理了子数组的每一个元素。

http://www.xdnf.cn/news/1063639.html

相关文章:

  • Happy-LLM-Task04 :2.2 Encoder-Decoder
  • JVM(8)——详解分代收集算法
  • Python元组常用操作方法
  • LangGraph--基础学习(工具调用)
  • 最具有实际意义价值的比赛项目
  • 消融实验视角下基于混合神经网络模型的银行股价预测研究
  • WINUI/WPF——Button不同状态下图标切换
  • LLM-201: OpenHands与LLM交互链路分析
  • 【JS-4.3-鼠标常用事件】深入理解DOM鼠标事件:全面指南与最佳实践
  • Rabbitmq的五种消息类型介绍,以及集成springboot的使用
  • React JSX语法
  • OCCT基础类库介绍:Modeling Algorithm - Features
  • 软件工程期末试卷简答题版带答案(共21道)
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • Vue3 + TypeScript + xlsx 导入excel文件追踪数据流转详细记录(从原文件到目标数据)
  • 领域驱动设计(DDD)【3】之事件风暴
  • EasyExcel导出极致封装 含枚举转换 分页导出
  • GitHub Copilot快捷键
  • 缓存与加速技术实践-Kafka消息队列
  • 腾讯云IM即时通讯:开启实时通信新时代
  • Python中字符串常用的操作方法
  • Linux TCP/IP协议栈中的TCP输入处理:net/ipv4/tcp_input.c解析
  • 学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)
  • AI与SEO关键词协同进化
  • IEC61850 通信协议测试验证方法详解
  • 解锁K-近邻算法:数据挖掘的秘密武器
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • 【AI论文】扩散二元性
  • 面试题-定义一个函数入参数是any类型,返回值是string类型,如何写出这个函数,代码示例
  • ncu学习笔记01——合并访存