C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译。

foreach (int x in myArray)
{
  x++; //错误代码,因为改变了元素的值
  Console.WriteLine(x);
}

如果要让自定义的数据类型支持foreach循环,则该类型必须实现IEnumerable<T>接口,且存在对应此列表的IEnumerator<T>实现。 实际上,在.Net的底层(IL语言层面)而言,

foreach (var x in list) // x的类型为T
{
  ...
}

等价于如下代码:

using (var iterator = list.GetEnumerator()) // iterator的类型为IEnumerator<T>
{
  while ( iterator.MoveNext() )
  {
    var x = iterator.Current();
    ... // 本段代码中禁止修改x的值——编译器会报错
  }
}

它只是为了让用户更加易于使用的等价描述形式。

时间: 2024-10-03 16:55:38

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)的相关文章

Sliverlight linq中的数组筛选数据库中的数据

首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. 它是.NET框架的扩展,它允许我们以数据库查询的方式查询数据集合. 借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据. 接下来讲讲我工作中用到的 linq中的数组筛选数据库中的数据 public List GetList1(string cardPhone,string

Java基础知识强化之IO流笔记45:IO流练习之 把文本文件中数据存储到集合中的案例

1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据源是一个文本文件.      目的地是一个集合.      而且元素是字符串.      数据源:   b.txt -- FileReader -- BufferedReader  目的地:  ArrayList<String> 2. 代码示例: 1 package cn.itcast_02; 2

将容器中(数组、集合)的数据串成字符串

开发工具VC7(VS2002) 核心代码用到MFC,测试代码用到stl 本代码功能,将容器中(数组.集合)的数据串成字符串 核心代码和扩展代码往往不是一个人完成的. 扩展代码和使用也很可能不是一个人写的. //核心代码 template<class TYPE> class IGetEleStr { public: virtual  CString GetStr(const TYPE& ele) const =0 ; }; class IGetSpe { public: virtual

判断数组或者集合中重复元素的个数。

当我们需要对数组或者集合中的元素进行重复元素个数时,我们不妨使用map来完成此操作. 由于map中key是唯一的,所以利用这一特性就可以对数组中重复元素进行统计. java实现代码如下. String[] names={"a","b","a","b","c"}; Map<String,Integer> sameElement=new HashMap<String,Integer>()

C#语言中的数组和集合

数组和集合 一.数组:具有定长性,占用内存少,遍历速度快,可实现的功能偏少,适用于数据数量确定的功能实现. 1. 数组的声明与赋值 声明:数据类型[ ]变量名:                                赋值:变量名=new 数据类型[长度]                                合并书写:数据类型[ ]变量名=new 数据类型[长度]                2.数组每一项的类型默认值:                             

从一个集合中过滤另一个集合中存在的项(类似in)

直接贴代码出来: List<PriceMark> list = PriceMarkDAL.m_PriceMarkDAL.GetList("Erp_ProName='TLC7528CDWR'"); ZWCUSTORDERClient pri = new ZWCUSTORDERClient(); ZwjgA610Konm[] Prices = new ZwjgA610Konm[11]; byte b = pri.ZWsPrice("TLC7528CDWR",

java中有关数组或集合的起始位详解

在jdbc连接数据库时,起始位都是从1开始的 例如:Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ms"); String sql="SELECT * FROM users WHERE NAME=?"; pstm=

浅谈PHP中的数组和JS中的数组

最近在做前后端对接的时候,遇到一个问题,前端要求返回的数据格式是左边的,但是我通过json_encode返回到的数据格式是右边的   注意:数据格式从"[]"(数组)变成了"{}"(对象) google了下,发现:javascript不支持关联数组 , PHP中索引数组转换成json是数组([]),php关联数组转换成json是对象( {} ) ,所以如果是关联数组的话,需要对数组做一些处理才行 PHP中的数组:索引数组和关联数组 PHP支持两种数组,一种是只保存&

找出一个整数数组中超过数组长度一半的元素(Java)

Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 package com.study.zhipengs.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, * 2}.由于数字2在数组中出现了5次,超过数组长度