一、C# foreach语句

foreach语句能够对实现Ienumerable接口的容器进行遍历,并提供一个枚举器来实现Ienumerable接口。foreach语句为数组或对象集合中的各个元素执行一个嵌入语句组。

另外,它还可用于循环访问集合以获取所需信息,但不能应用于更改集合内容以避免产生不可预知的副作用。

语法格式如下:

foreach(type identifier in expression)
{
    embedded-statement
}

type(类型)和identifier(标识符)用于声明循环变量,expression(表达式)对应集合。

每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。在这里,循环变量是一个只读型局部变量,如果试图改变它的值或将它作为一个ref或out类型的参数传递,都将引发编译时错误。

foreach语句中的expression必须是集合类型,如果该集合的元素类型与循环变量类型不一致,则必须有一个显式定义的从集合中的元素类型到循环变量元素类型的显式转换。

foreach语句的执行顺序如下:

(1)计算集合表达式的值并生成一种集合类型的实例。

(2)调用集合的GetEnumerator方法得到一个枚举实例的值,返回的枚举值将存放在一个临时局部变量中。

(3)调用临时局部变量的MoveNext方法,以获取下一个枚举元素。

(4)如果MoveNext方法的返回值为false,则表明已为集合中的所有元素完成循环,控制传递给foreach块后的下一条语句,否则继续执行。

(5)计算临时局部变量的Current属性以获取当前枚举值并将其转换为foreach语句中规定的变量类型,并将结果存储在迭代变量中,以便在循环体内可以访问该变量的值。

(6)执行循环体包含的语句,然后转到第(3)步开始下一轮循环。

二、提示

C#中集合类型的定义:

?集合类型必须支持一个形为GetEnumerator()的公有的非静态方法,该方法的返回类型为结构、类或接口。
?形为GetEnumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的方法MoveNext(),该方法的返回类型为布尔型。
?形为GetEnumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的属性Current,该属性可以读出。
如果一个类型同时满足以上三个条件,该类型称为集合类型。Current属性的类型叫做该集合类型的元素类型。

foreach语句也支持数组类型,对于一维数组,执行顺序是从下标为0的元素开始,一直到数组的最后一个元素;对于多维数组,元素下标的递增是从最右边那一维开始的,依次类推。

同样,break和continue可以出现在foreach语句中,功能不变。

三、示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // C# foreach语句-www.baike369.com
            int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Console.Write("数组元素的值为:");
            foreach (int elementArray in array)
            {
                Console.Write("{0} ", elementArray);
            }
            Console.ReadLine();
        }
    }
}

运行结果:

数组元素的值为:0 1 2 3 4 5 6 7 8 9

C# foreach语句的更多相关文章

  1. Java Iterator, ListIterator 和 foreach语句使用

    Java Iterator, ListIterator 和 foreach语句使用 foreach语句结构: for(part1:part2){part3};  part2 中是一个数组对象,或者是带 ...

  2. 【Java学习笔记】foreach语句(高级for)

    package p2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java ...

  3. foreach语句

    foreach语句他无非就是for循环的封装,为了提高开发速度才创造出来的.他其实跟for循环一样,只不过写起来比较简便,他是1.5版本才出来的一种封装语法.并没有什么奇特之处他里面的机制就是for循 ...

  4. Java中的可变参数以及foreach语句

    Java中的可变参数的定义格式如下: 返回值类型  方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型  变量名称 :数据名称){ ... } public ...

  5. 可迭代的集合类型使用foreach语句

    在学习算法这本书图论那一部分的时候,接触到了几个类似for(int w:G.adj(v)),的语句,不是很理解,就去百度,发现这是一种叫做foreach的语法,在书的76页有讲到,但是之前没认真看书, ...

  6. 自定义一个可以使用foreach语句进行迭代的类(IEnumerable)

    在c#中,凡是实现了IEnumerable接口的数据类型都可以用foreach语句进行迭代访问.所以,我们要定义一个可以使用foreach进行迭代访问的类,就必须要实现IEnumerable接口. / ...

  7. C#中foreach语句的迭代器实现机制

    C#中的foreach语句可用于循环遍历某个集合中的元素,而所有的只要支持了IEnumerable或IEnumerable<T>泛型接口的类型都是可以 用foreach遍历的.其具体的遍历 ...

  8. C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题

    这个问题从<C#高级编程>数组一节中的foreach语句(6.7.2)发现的. 因为示例代码与之前的章节连贯,所以我修改了一下,把自定义类型改为了int int[] bs = { 2, 3 ...

  9. 从foreach语句枚举元素看数组

    在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的 ...

  10. 浅析foreach语句

    本篇是我对于foreach语句(增强for)的总结: 我的总结流程如下: 1.先整体说明增强for遍历集合与数组之间的区别. 2.通过一维数组来说明(给出反编译的源码,形成对照). 3.通过二维数组来 ...

随机推荐

  1. Mybatis学习笔记10 - 动态sql之if判断

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import java.util.List; public ...

  2. #define\const\inline的区别与联系

    总结: const用于代替#define一个固定的值,inline用于代替#define一个函数.是#define的升级版,为了消除#define的缺陷. 参考内容:http://www.cnblog ...

  3. C# 本地文件的上传和下载

    本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...

  4. 先定个小目标, 使用C# 开发的千万级应用

    dotNET跨平台 微信号 opendotnet 功能介绍 在这里你可以谈微软.NET,Mono的跨平台开发技术,也可以谈谈其他的跨平台技术.在这里可以让你的.NET项目有新的思路,不局限于微软的技术 ...

  5. iOS重用宏定义

    iOS 多快好省的宏(转) 原文地址:http://my.oschina.net/yongbin45/blog/150149 // 字符串: #ifndef nilToEmpty #define ni ...

  6. CentOS 6.5下安装Tomcat --专业增强版 非yum

    Tomcat安装 通常情况下我们要配置Tomcat是很容易的一件事情,但是如果您要架设多用户多服务的Java虚拟主机就不那么容易了.其中最大的一个问题就是Tomcat执行权限.普通方式配置的Tomca ...

  7. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  8. Linq to Sql 左连接 , 取右表可能为 null的 int类型字段

    linq to sql , linq to entity 遇到一个问题, 主表, 从表 一对一 关系,  主表有记录, 从表 可能没有记录. 现在要查询 主表+从表 的某几个字段. 从表字段 有的是 ...

  9. [SVN]TortoiseSVN工具培训1─为什么要用SVN?

    你是否有经历过以下情况: SVN的使用理由/好处:

  10. 光标显示样式 css 中 cursor 属性使用

    记录一下 cursor 的各种样式,方便自己查找.之前用到不常用的每次去 百度 或 Google 找不如自己记录下好找些. cursor光标类型 auto default none context-m ...