c#中 foreach 用法

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面
的执行语句。

foreach语句经常与数组一起使用,下面实例将通过foreach语句读取数组的值并进行显示。

数组的属性:Array.Length数组的容量

利用这个属性,我们可以取得数组对象允许存储的容量值,也就是数组的长度、元素个数,这个比较好理解,数组还有其他的属性,比如数组的维数等,属性的用法比较简单,学会一种,其他的格式基本一致,这里我们就不举例了。

当数组的维数、容量较多时,C#提供了foreach语句,专门用来读取集合/数组中的所有元素,我们把这种功能叫做遍历。语法书写如下:

遍历数组:foreach(type objName in collection/Array)

这段语句会逐一检查数组中的所存储的变量值,并且一一将其取出,其中的type是你所要读取的数组对象将要存储在objName变量的数据类型,而objName是定义了一个type类型的变量名,代表每一次从集合和数组(collection/Array)中取得的元素,collection/Array则是所要存取的数组对象。用这种方法只需写一个foreach就可以遍历出除交错数组以外的所有维数的数组。

注: objName的数据类型type必须与collection/Array对象的类型相同或比它大。

下面我们举一个用foreach和for遍历规则数组的例子,其中涉及到了一个数组得到维数的方法,比较foreach在一次性遍历规则数组上的优势。

           int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组a

            for (int i = 0; i < a.GetLength (0) ;i++ )   //用Array.GetLength(n)得到数组[0,1,,,n]上的维数的元素数,0代表行,1列,n代表此数组是n+1维

            {

                for (int j = 0; j < a.GetLength(1); j++)

                {

                    for (int z = 0; z < a.GetLength(2);z++ )//2代表得到纵深上的元素数,如果数组有n维就得写n个for循环

                    {

                        Console.WriteLine(a[i,j,z]);

                    }

                }

            }

用foreach循环一次性遍历a数组

          int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组a
                      foreach(int i in a)
                      {
                          Console .WriteLine (i);
                      }

这两种代码执行的结果是一样的都是 每行一个元素,共8行,元素分别是1 2 3 4 5 6 7 8

下面我们再做个例子,是一个利用for和foreach循环做的存取数组元素的例子,首先提示用户输入学生的个数,然后把学生个数作为存储学生姓名的数组names的元素个数,采用for循环按照数组的索引i从0位开始循环输出“输入学生姓名”的提示,并把用户输入的学生姓名按照其在数组的索引方式names[i]存储在names数组中,for循环次数的最大值(即索引的最大值)通过数组属性.Length得到,我们说过容量与索引之间的关系是index=Array.Length-1,本题即i的最大值<names.Length,存储后,提示“输出学生姓名”,再用foreach循环一次性遍历names数组中存储的每个元素(学生的姓名),一个一个的把它赋值给name元素,然后输出到控制台上。

必须注意的是,借助foreach,只能一一取得数组中的元素,并不能利用这种语句改变数组所存储的元素。



using System;
class Program
{
static void Main()
{
   int count;
   Console.WriteLine("输入要登记的学生数");
   count = int.Parse(Console.ReadLine());
   string[]names = new string[count];
   for (int i = 0; i < names.Length; i++)
   {
    Console.WriteLine("请输入第{0}个学生的姓名", i + 1);
    names[i] = Console.ReadLine();
   }
   Console.WriteLine("已登记的学生如下");
   foreach (string name in names)
   {
    Console.WriteLine("{0}", name);
   }
   Console.ReadKey();
}
}

<think>嗯,用户想了解C#foreach的使用方法,包括教程、示例和语法。首先,我需要根据用户提供的引用资料整理出清晰的回答结构。用户给的引用1到4都提到了foreach的基本语法、遍历数组、集合以及字典的例子,还有注意事项。 首先,我应该从语法开始,引用1提到foreach循环用于遍历实现了IEnumerable接口的对象,语法结构是foreach (元素类型 变量 in 集合)。然后,给出遍历数组的示例,比如引用2中的代码,展示int数组的遍历。接着是集合,比如引用3中的List<int>例子,说明同样的语法适用于不同的集合类型。 接下来是字典的遍历,引用4提到使用KeyValuePair来访问键和值,需要展示如何遍历字典的键值对。然后,可能还要提到其他集合类型,比如字符串中的字符,或者自定义集合,这样用户知道foreach的广泛应用。 然后,注意事项部分,比如不能修改集合元素,只能读取。引用1和引用3都提到foreach简化了遍历,无需管理索引,但修改元素会导致异常。这里需要提醒用户注意。 接下来是常见错误,比如尝试在循环中修改集合,或者使用错误的变量类型,比如遍历字典时没有用KeyValuePair。引用4中的字典例子正好可以说明正确用法。 最后,生成相关问题,可能涉及性能、与for循环的比较、自定义集合的支持等。这些需要结合用户可能遇到的进一步疑问来设计。 整理结构的时候要确保每个部分都有对应的引用标注,比如语法部分用引用1,数组示例用引用2,集合示例用引用3,字典用引用4。同时,代码示例要正确,符合C#语法,并且用代码块格式展示。 还需要检查是否有遗漏的信息,比如foreach只能用于IEnumerable对象,这点在引用1中提到,需要在语法部分说明。另外,注意事项里是否还有其他点,比如迭代过程中集合被修改会抛出异常,这也需要提及。 可能用户是初学者,所以语言要尽量通俗,步骤清晰,示例明确。避免使用过于专业的术语,或者在必要时解释清楚。比如解释KeyValuePair是什么,为什么在遍历字典时需要用到它。 最后,确保回答符合用户的要求,结构包括语法、示例、注意事项、常见错误,并且相关问题能够引导用户进一步学习。可能需要检查每个引用是否正确对应到内容,避免混淆。比如引用3中的List示例是否正确,引用4的字典是否正确处理键值对。 总结下来,回答的结构应该是: 1. 基本语法(引用1) 2. 示例部分: a. 遍历数组(引用2) b. 遍历集合如List(引用3) c. 遍历字典(引用4) 3. 其他集合类型 4. 注意事项(不可修改元素,引用1、3) 5. 常见错误(修改元素,变量类型错误) 6. 相关问题 现在把这些部分组织起来,确保每个部分都有对应的引用,并且示例代码正确无误。同时,使用中文回答,行内公式用$...$,但在这个问题中可能不太需要数学公式,但如果有的话要符合格式。独立公式如果有的话要用$$...$$,但这里可能不需要。 检查是否有遗漏的信息,比如foreach在遍历字符串时的应用,或者如何实现自定义集合支持foreach,这些可能也是用户感兴趣的点,可以放在其他集合类型部分。 最后,确保生成的相关问题有针对性,比如性能优化、异常处理、与其他循环结构的对比等,帮助用户深入理解。</think>### C# foreach 循环使用详解 #### 一、基本语法 `foreach` 循环用于遍历实现了 `IEnumerable` 或 `IEnumerable<T>` 接口的集合(如数组、列表、字典等)。其语法结构为: ```csharp foreach (元素类型 变量 in 集合) { // 操作代码 } ``` 例如:`foreach (int num in numbers)` 表示遍历整数集合中的每个元素[^1]。 --- #### 二、示例演示 1. **遍历数组** ```csharp int[] numbers = { 1, 2, 3, 4, 5 }; foreach (int num in numbers) { Console.WriteLine(num); } ``` 输出结果依次为 1 到 5[^2]。 2. **遍历列表** ```csharp List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" }; foreach (string fruit in fruits) { Console.WriteLine(fruit); } ``` 输出结果为列表中每个水果名称[^3]。 3. **遍历字典** ```csharp Dictionary<int, string> students = new Dictionary<int, string> { { 101, "Alice" }, { 102, "Bob" } }; foreach (KeyValuePair<int, string> entry in students) { Console.WriteLine($"ID: {entry.Key}, Name: {entry.Value}"); } ``` 输出结果为字典中的键值对[^4]。 --- #### 三、其他集合类型 - **字符串遍历字符** ```csharp string text = "Hello"; foreach (char c in text) { Console.WriteLine(c); // 输出 H, e, l, l, o } ``` - **自定义集合** 若类实现了 `IEnumerable` 接口,也可通过 `foreach` 遍历。 --- #### 四、注意事项 1. **只读访问** 在 `foreach` 循环中无法直接修改集合元素。例如以下代码会报错: ```csharp foreach (int num in numbers) { num = num * 2; // ❌ 编译错误:无法修改迭代变量 } ``` 2. **迭代中集合不可变** 遍历时若对集合进行增删操作(如 `Add()` 或 `Remove()`),会抛出 `InvalidOperationException`。 3. **类型匹配** 变量类型需与集合元素类型一致。例如遍历字典时必须使用 `KeyValuePair<TKey, TValue>`。 --- #### 五、常见错误场景 ```csharp // 错误1:尝试修改集合 List<int> list = new List<int> { 1, 2, 3 }; foreach (int item in list) { list.Add(4); // ❌ 运行时异常:集合已更改 } // 错误2:变量类型不匹配 Dictionary<int, string> dict = new Dictionary<int, string>(); foreach (int key in dict) // ❌ 应使用 KeyValuePair<int, string> { // ... } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值